Skip to content

Commit 773fee0

Browse files
authored
Approve requests (#10486)
Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
1 parent 2bdf82d commit 773fee0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1496
-60
lines changed

common/config/rush/pnpm-lock.yaml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

models/process/src/actions.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,23 @@ export function defineMethods (builder: Builder): void {
3131
process.method.RunSubProcess
3232
)
3333

34+
builder.createDoc(
35+
process.class.Method,
36+
core.space.Model,
37+
{
38+
label: process.string.RequestApproval,
39+
objectClass: process.class.ApproveRequest,
40+
editor: process.component.ApproveRequestEditor,
41+
presenter: process.component.ApproveRequestPresenter,
42+
createdContext: {
43+
_class: process.class.ApproveRequest,
44+
nameField: 'title'
45+
},
46+
requiredParams: ['user']
47+
},
48+
process.method.RequestApproval
49+
)
50+
3451
builder.createDoc(
3552
process.class.Method,
3653
core.space.Model,
@@ -103,4 +120,30 @@ export function defineMethods (builder: Builder): void {
103120
},
104121
process.method.AddTag
105122
)
123+
124+
builder.createDoc(
125+
process.class.Method,
126+
core.space.Model,
127+
{
128+
label: process.string.LockCard,
129+
objectClass: card.class.Card,
130+
requiredParams: [],
131+
createdContext: null
132+
},
133+
process.method.LockCard
134+
)
135+
136+
builder.createDoc(
137+
process.class.Method,
138+
core.space.Model,
139+
{
140+
label: process.string.LockSection,
141+
objectClass: card.class.Card,
142+
editor: process.component.LockSectionEditor,
143+
presenter: process.component.LockSectionPresenter,
144+
requiredParams: ['_id'],
145+
createdContext: null
146+
},
147+
process.method.LockSection
148+
)
106149
}

models/process/src/index.ts

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import workbench from '@hcengineering/model-workbench'
4646
import notification from '@hcengineering/notification'
4747
import { type Asset, type IntlString, type Resource } from '@hcengineering/platform'
4848
import {
49+
type ApproveRequest,
4950
type CheckFunc,
5051
type ContextId,
5152
type CreatedContext,
@@ -204,6 +205,19 @@ export class TProcessToDo extends TToDo implements ProcessToDo {
204205
withRollback!: boolean
205206
}
206207

208+
@Model(process.class.ApproveRequest, process.class.ProcessToDo)
209+
export class TApproveRequest extends TProcessToDo implements ApproveRequest {
210+
@Prop(TypeBoolean(), process.string.IsApproved)
211+
approved?: boolean
212+
213+
@Prop(TypeString(), process.string.RejectionReason)
214+
reason?: string
215+
216+
group!: string
217+
218+
card!: Ref<Card>
219+
}
220+
207221
@Model(process.class.Method, core.class.Doc, DOMAIN_MODEL)
208222
export class TMethod extends TDoc implements Method<Doc> {
209223
label!: IntlString
@@ -290,6 +304,7 @@ export function createModel (builder: Builder): void {
290304
TProcess,
291305
TExecution,
292306
TProcessToDo,
307+
TApproveRequest,
293308
TMethod,
294309
TState,
295310
TProcessFunction,
@@ -323,6 +338,28 @@ export function createModel (builder: Builder): void {
323338
process.ids.ProcessToDoCreated
324339
)
325340

341+
builder.createDoc(
342+
notification.class.NotificationType,
343+
core.space.Model,
344+
{
345+
hidden: false,
346+
generated: false,
347+
allowedForAuthor: true,
348+
label: process.string.ApproveRequest,
349+
group: time.ids.TimeNotificationGroup,
350+
txClasses: [core.class.TxCreateDoc],
351+
objectClass: process.class.ApproveRequest,
352+
onlyOwn: true,
353+
defaultEnabled: true,
354+
templates: {
355+
textTemplate: '{body}',
356+
htmlTemplate: '<p>{body}</p>',
357+
subjectTemplate: '{title}'
358+
}
359+
},
360+
process.ids.ApproveRequestCreated
361+
)
362+
326363
createAction(builder, {
327364
action: view.actionImpl.Delete,
328365
label: view.string.Delete,
@@ -413,6 +450,42 @@ export function createModel (builder: Builder): void {
413450
presenter: process.component.StatePresenter
414451
})
415452

453+
builder.createDoc(
454+
view.class.Viewlet,
455+
core.space.Model,
456+
{
457+
variant: 'cardRequests',
458+
attachTo: process.class.ApproveRequest,
459+
descriptor: view.viewlet.List,
460+
props: {
461+
baseMenuClass: process.class.ApproveRequest
462+
},
463+
viewOptions: {
464+
groupBy: ['user', 'approved'],
465+
orderBy: [
466+
['approved', SortingOrder.Descending],
467+
['modifiedOn', SortingOrder.Descending],
468+
['createdOn', SortingOrder.Descending]
469+
],
470+
other: []
471+
},
472+
configOptions: {
473+
strict: true
474+
},
475+
config: [
476+
{
477+
key: '',
478+
label: process.string.ApproveRequest,
479+
presenter: process.component.ApproveRequestPresenter
480+
},
481+
'user',
482+
'approved',
483+
'reason'
484+
]
485+
},
486+
process.viewlet.CardRequests
487+
)
488+
416489
builder.createDoc(
417490
view.class.Viewlet,
418491
core.space.Model,
@@ -600,6 +673,12 @@ export function createModel (builder: Builder): void {
600673
props: {}
601674
})
602675

676+
builder.createDoc(presentation.class.ComponentPointExtension, core.space.Model, {
677+
extension: card.extensions.EditCardExtension,
678+
component: process.component.RequestsExtension,
679+
props: {}
680+
})
681+
603682
builder.createDoc(presentation.class.ComponentPointExtension, core.space.Model, {
604683
extension: card.extensions.EditCardHeaderExtension,
605684
component: process.component.ProcessesHeaderExtension,
@@ -623,6 +702,19 @@ export function createModel (builder: Builder): void {
623702
process.section.CardProcesses
624703
)
625704

705+
builder.createDoc(
706+
card.class.CardSection,
707+
core.space.Model,
708+
{
709+
label: process.string.ApproveRequest,
710+
component: process.component.RequestsCardSection,
711+
checkVisibility: process.function.CheckRequestsSectionVisibility,
712+
order: 360,
713+
navigation: []
714+
},
715+
process.section.CardApproveRequest
716+
)
717+
626718
builder.createDoc(card.class.MasterTagEditorSection, core.space.Model, {
627719
id: 'processes',
628720
label: process.string.Processes,

models/process/src/plugin.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,16 @@ export default mergeIds(processId, process, {
2424
Process: '' as Ref<Doc>
2525
},
2626
section: {
27-
CardProcesses: '' as Ref<CardSection>
27+
CardProcesses: '' as Ref<CardSection>,
28+
CardApproveRequest: '' as Ref<CardSection>
2829
},
2930
pipeline: {
3031
ProcessMiddleware: '' as Ref<PresentationMiddlewareFactory>
3132
},
3233
ids: {
3334
ProcessSettings: '' as Ref<Doc>,
34-
ProcessToDoCreated: '' as Ref<Doc>
35+
ProcessToDoCreated: '' as Ref<Doc>,
36+
ApproveRequestCreated: '' as Ref<Doc>
3537
},
3638
actionImpl: {
3739
ContinueExecution: '' as ViewAction

models/process/src/triggers.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,38 @@ import { type Builder } from '@hcengineering/model'
1616
import process from './plugin'
1717

1818
export function defineTriggers (builder: Builder): void {
19+
builder.createDoc(
20+
process.class.Trigger,
21+
core.space.Model,
22+
{
23+
label: process.string.OnApproveRequestApproved,
24+
icon: process.icon.ToDo,
25+
editor: process.component.ApproveRequestTriggerEditor,
26+
presenter: process.component.ApproveRequestTriggerPresenter,
27+
requiredParams: ['_id'],
28+
checkFunction: process.triggerCheck.ApproveRequestApproved,
29+
init: false,
30+
auto: true
31+
},
32+
process.trigger.OnApproveRequestApproved
33+
)
34+
35+
builder.createDoc(
36+
process.class.Trigger,
37+
core.space.Model,
38+
{
39+
label: process.string.OnApproveRequestRejected,
40+
icon: process.icon.ToDoRemove,
41+
editor: process.component.ApproveRequestTriggerEditor,
42+
presenter: process.component.ApproveRequestTriggerPresenter,
43+
requiredParams: ['_id'],
44+
checkFunction: process.triggerCheck.ApproveRequestRejected,
45+
init: false,
46+
auto: true
47+
},
48+
process.trigger.OnApproveRequestRejected
49+
)
50+
1951
builder.createDoc(
2052
process.class.Trigger,
2153
core.space.Model,

models/server-process/src/index.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,16 @@ export function createModel (builder: Builder): void {
7070
serverCheckFunc: serverProcess.func.FieldChangedCheck
7171
})
7272

73+
builder.mixin(process.trigger.OnApproveRequestApproved, process.class.Trigger, serverProcess.mixin.TriggerImpl, {
74+
preventRollback: true,
75+
serverCheckFunc: serverProcess.func.ApproveRequestApproved
76+
})
77+
78+
builder.mixin(process.trigger.OnApproveRequestRejected, process.class.Trigger, serverProcess.mixin.TriggerImpl, {
79+
preventRollback: true,
80+
serverCheckFunc: serverProcess.func.ApproveRequestRejected
81+
})
82+
7383
builder.mixin(process.trigger.OnExecutionStart, process.class.Trigger, serverProcess.mixin.TriggerImpl, {
7484
preventRollback: true
7585
})
@@ -117,6 +127,18 @@ export function createModel (builder: Builder): void {
117127
func: serverProcess.func.AddTag
118128
})
119129

130+
builder.mixin(process.method.RequestApproval, process.class.Method, serverProcess.mixin.MethodImpl, {
131+
func: serverProcess.func.RequestApproval
132+
})
133+
134+
builder.mixin(process.method.LockCard, process.class.Method, serverProcess.mixin.MethodImpl, {
135+
func: serverProcess.func.LockCard
136+
})
137+
138+
builder.mixin(process.method.LockSection, process.class.Method, serverProcess.mixin.MethodImpl, {
139+
func: serverProcess.func.LockSection
140+
})
141+
120142
builder.mixin(process.function.FirstValue, process.class.ProcessFunction, serverProcess.mixin.FuncImpl, {
121143
func: serverProcess.transform.FirstValue
122144
})

plugins/card-resources/src/components/CardAttributeEditor.svelte

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,26 @@
5555
<div class="divider" />
5656
{/if}
5757
<div class="masterTag">
58-
<MasterTagAttributes bind:this={masterTagAttributes} {readonly} {value} {ignoreKeys} fourRows={columns === 2} />
58+
<MasterTagAttributes
59+
bind:this={masterTagAttributes}
60+
readonly={readonly || value.readonlySections?.includes(value._class)}
61+
{value}
62+
{ignoreKeys}
63+
fourRows={columns === 2}
64+
/>
5965
</div>
6066
{#if mixins.length > 0}
6167
<div class="divider" />
6268
<Grid column={columns} columnGap={0} rowGap={0} alignItems={'start'}>
6369
{#each mixins as tag, i (tag._id)}
6470
<div class="tag" class:withoutBorder={Math.ceil((i + 1) / columns) === Math.ceil(mixins.length / columns)}>
65-
<TagAttributes bind:this={tagAttributes[i]} {readonly} {tag} {value} {ignoreKeys} />
71+
<TagAttributes
72+
bind:this={tagAttributes[i]}
73+
readonly={readonly || value.readonlySections?.includes(tag._id)}
74+
{tag}
75+
{value}
76+
{ignoreKeys}
77+
/>
6678
</div>
6779
{/each}
6880
</Grid>

plugins/card-resources/src/components/sections/ContentSection.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
<div class="content" class:hidden>
5353
<Content
5454
{doc}
55-
readonly={readonly || updatePermissionForbidden}
55+
readonly={readonly || updatePermissionForbidden || doc.readonlySections?.includes(doc._class)}
5656
content={contentDiv}
5757
showToc={false}
5858
on:loaded

plugins/card/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,10 @@ export interface Card extends Doc, IconProps, VersionableDoc {
5757
parentInfo: ParentInfo[]
5858
parent?: Ref<Card> | null
5959
rank: Rank
60-
readonly?: boolean
6160

6261
peerId?: string
62+
63+
readonlySections?: Ref<MasterTag>[]
6364
}
6465

6566
export interface CardSpace extends TypedSpace {

plugins/login-resources/src/plugin.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,6 @@ export default mergeIds(loginId, login, {
3434
HaveAccount: '' as IntlString,
3535
LoadingAccount: '' as IntlString,
3636
Join: '' as IntlString,
37-
Email: '' as IntlString,
38-
Password: '' as IntlString,
39-
PasswordRepeat: '' as IntlString,
4037
Workspace: '' as IntlString,
4138
SignUp: '' as IntlString,
4239
DoNotHaveAnAccount: '' as IntlString,

0 commit comments

Comments
 (0)