@things-factory/announcement 10.1.255 → 10.1.257
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/components/announcement-receipts.ts +31 -36
- package/client/components/announcement-sheet.ts +18 -15
- package/client/components/audience-picker.ts +41 -28
- package/client/pages/announcement-editor.ts +125 -87
- package/client/pages/announcement-view.ts +38 -36
- package/client/utils/announcement-api.ts +3 -50
- package/dist-client/components/announcement-receipts.d.ts +6 -5
- package/dist-client/components/announcement-receipts.js +24 -52
- package/dist-client/components/announcement-receipts.js.map +1 -1
- package/dist-client/components/announcement-sheet.d.ts +2 -1
- package/dist-client/components/announcement-sheet.js +15 -21
- package/dist-client/components/announcement-sheet.js.map +1 -1
- package/dist-client/components/audience-picker.d.ts +8 -4
- package/dist-client/components/audience-picker.js +35 -35
- package/dist-client/components/audience-picker.js.map +1 -1
- package/dist-client/pages/announcement-editor.d.ts +22 -12
- package/dist-client/pages/announcement-editor.js +116 -130
- package/dist-client/pages/announcement-editor.js.map +1 -1
- package/dist-client/pages/announcement-view.d.ts +7 -4
- package/dist-client/pages/announcement-view.js +34 -48
- package/dist-client/pages/announcement-view.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/utils/announcement-api.d.ts +0 -47
- package/dist-client/utils/announcement-api.js +3 -21
- package/dist-client/utils/announcement-api.js.map +1 -1
- package/dist-server/index.d.ts +1 -0
- package/dist-server/index.js +1 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/dist-server/work-doors.d.ts +1 -0
- package/dist-server/work-doors.js +11 -0
- package/dist-server/work-doors.js.map +1 -0
- package/package.json +11 -11
- package/server/index.ts +1 -0
- package/server/work-doors.ts +9 -0
- package/translations/en.json +2 -1
- package/translations/es.json +2 -1
- package/translations/ja.json +2 -1
- package/translations/ko.json +2 -1
- package/translations/ms.json +2 -1
- package/translations/zh.json +2 -1
|
@@ -92,7 +92,6 @@ export declare const FULL_FIELDS = "id title category importance status startsAt
|
|
|
92
92
|
/** Tells the badge and an open list that a reading changed. */
|
|
93
93
|
export declare const announcementsChanged: () => boolean;
|
|
94
94
|
export declare const announcementApi: {
|
|
95
|
-
one: (id: string) => Promise<AnnouncementItem | null>;
|
|
96
95
|
summary: () => Promise<{
|
|
97
96
|
unread: number;
|
|
98
97
|
toAcknowledge: number;
|
|
@@ -100,50 +99,4 @@ export declare const announcementApi: {
|
|
|
100
99
|
}>;
|
|
101
100
|
popups: () => Promise<AnnouncementItem[]>;
|
|
102
101
|
read: (id: string) => Promise<AnnouncementItem>;
|
|
103
|
-
acknowledge: (id: string) => Promise<AnnouncementItem>;
|
|
104
|
-
receipts: (id: string) => Promise<{
|
|
105
|
-
userId: string;
|
|
106
|
-
name?: string;
|
|
107
|
-
email?: string;
|
|
108
|
-
listed: boolean;
|
|
109
|
-
notifiedAt?: string;
|
|
110
|
-
readAt?: string;
|
|
111
|
-
acknowledgedAt?: string;
|
|
112
|
-
}[]>;
|
|
113
|
-
revisions: (id: string) => Promise<{
|
|
114
|
-
version: number;
|
|
115
|
-
title: string;
|
|
116
|
-
body?: string;
|
|
117
|
-
rest?: any;
|
|
118
|
-
createdAt: string;
|
|
119
|
-
creator?: {
|
|
120
|
-
name?: string;
|
|
121
|
-
};
|
|
122
|
-
}[]>;
|
|
123
|
-
choices: () => Promise<{
|
|
124
|
-
domainId: string;
|
|
125
|
-
domainName: string;
|
|
126
|
-
departments: {
|
|
127
|
-
id: string;
|
|
128
|
-
name: string;
|
|
129
|
-
note?: string;
|
|
130
|
-
}[];
|
|
131
|
-
roles: {
|
|
132
|
-
id: string;
|
|
133
|
-
name: string;
|
|
134
|
-
note?: string;
|
|
135
|
-
}[];
|
|
136
|
-
}>;
|
|
137
|
-
people: (text: string) => Promise<{
|
|
138
|
-
id: string;
|
|
139
|
-
name: string;
|
|
140
|
-
note?: string;
|
|
141
|
-
}[]>;
|
|
142
|
-
audienceSize: (audiences: Audience[]) => Promise<number>;
|
|
143
|
-
create: (input: AnnouncementInput, attach: File[], uploading?: (fraction: number) => void) => Promise<AnnouncementItem>;
|
|
144
|
-
update: (id: string, input: AnnouncementInput, attach: File[], remove: string[], notifyAgain: boolean, uploading?: (fraction: number) => void) => Promise<AnnouncementItem>;
|
|
145
|
-
publish: (id: string) => Promise<AnnouncementItem>;
|
|
146
|
-
withdraw: (id: string, reason: string) => Promise<AnnouncementItem>;
|
|
147
|
-
remove: (id: string) => Promise<boolean>;
|
|
148
|
-
remind: (id: string) => Promise<number>;
|
|
149
102
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* The announcement doors
|
|
2
|
+
* The announcement doors the editor, the badge and the popups call (ADR-0163). Every call throws the server's words when
|
|
3
|
+
* it is refused. The other screens declare their own reads and saves (ADR-0190).
|
|
3
4
|
*/
|
|
4
5
|
import gql from 'graphql-tag';
|
|
5
6
|
import { client, uploadContext } from '@operato/graphql';
|
|
@@ -22,31 +23,12 @@ async function change(mutation, variables, field, uploading) {
|
|
|
22
23
|
/** Tells the badge and an open list that a reading changed. */
|
|
23
24
|
export const announcementsChanged = () => window.dispatchEvent(new CustomEvent('announcements-changed'));
|
|
24
25
|
export const announcementApi = {
|
|
25
|
-
one: (id) => ask(`query ($id: String!) { announcement(id: $id) { ${FULL_FIELDS} readCount acknowledgedCount } }`, { id }, 'announcement'),
|
|
26
26
|
summary: () => ask(`query { announcementSummary { unread toAcknowledge pending } }`, {}, 'announcementSummary'),
|
|
27
27
|
popups: () => ask(`query { announcementPopups { ${FULL_FIELDS} } }`, {}, 'announcementPopups'),
|
|
28
28
|
read: async (id) => {
|
|
29
29
|
const one = await change(`mutation ($id: String!) { readAnnouncement(id: $id) { id readerState mine { readAt acknowledgedAt } } }`, { id }, 'readAnnouncement');
|
|
30
30
|
announcementsChanged();
|
|
31
31
|
return one;
|
|
32
|
-
}
|
|
33
|
-
acknowledge: async (id) => {
|
|
34
|
-
const one = await change(`mutation ($id: String!) { acknowledgeAnnouncement(id: $id) { id readerState mine { readAt acknowledgedAt } } }`, { id }, 'acknowledgeAnnouncement');
|
|
35
|
-
announcementsChanged();
|
|
36
|
-
return one;
|
|
37
|
-
},
|
|
38
|
-
receipts: (id) => ask(`query ($id: String!) { announcementReceipts(id: $id) { userId name email listed notifiedAt readAt acknowledgedAt } }`, { id }, 'announcementReceipts'),
|
|
39
|
-
revisions: (id) => ask(`query ($id: String!) { announcementRevisions(id: $id) { version title body rest createdAt creator { name } } }`, { id }, 'announcementRevisions'),
|
|
40
|
-
choices: () => ask(`query { announcementAudienceChoices { domainId domainName departments { id name note } roles { id name note } } }`, {}, 'announcementAudienceChoices'),
|
|
41
|
-
people: (text) => ask(`query ($text: String!) { announcementPeople(text: $text) { id name note } }`, { text }, 'announcementPeople'),
|
|
42
|
-
audienceSize: (audiences) => ask(`query ($audiences: [AnnouncementAudienceInput!]!) { announcementAudienceSize(audiences: $audiences) }`, { audiences }, 'announcementAudienceSize'),
|
|
43
|
-
create: (input, attach, uploading) => change(`mutation ($input: AnnouncementInput!, $attach: [Upload!]) { createAnnouncement(input: $input, attach: $attach) { id } }`, { input, attach }, 'createAnnouncement', attach.length ? uploading ?? (() => { }) : undefined),
|
|
44
|
-
update: (id, input, attach, remove, notifyAgain, uploading) => change(`mutation ($id: String!, $input: AnnouncementInput!, $attach: [Upload!], $remove: [String!], $notifyAgain: Boolean) {
|
|
45
|
-
updateAnnouncement(id: $id, input: $input, attach: $attach, remove: $remove, notifyAgain: $notifyAgain) { id status }
|
|
46
|
-
}`, { id, input, attach, remove, notifyAgain }, 'updateAnnouncement', attach.length ? uploading ?? (() => { }) : undefined),
|
|
47
|
-
publish: (id) => change(`mutation ($id: String!) { publishAnnouncement(id: $id) { id status startsAt } }`, { id }, 'publishAnnouncement'),
|
|
48
|
-
withdraw: (id, reason) => change(`mutation ($id: String!, $reason: String!) { withdrawAnnouncement(id: $id, reason: $reason) { id status } }`, { id, reason }, 'withdrawAnnouncement'),
|
|
49
|
-
remove: (id) => change(`mutation ($id: String!) { deleteAnnouncement(id: $id) }`, { id }, 'deleteAnnouncement'),
|
|
50
|
-
remind: (id) => change(`mutation ($id: String!) { remindAnnouncement(id: $id) }`, { id }, 'remindAnnouncement')
|
|
32
|
+
}
|
|
51
33
|
};
|
|
52
34
|
//# sourceMappingURL=announcement-api.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announcement-api.js","sourceRoot":"","sources":["../../client/utils/announcement-api.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The announcement doors as the screens call them (ADR-0163). Every call throws the server's words when it is refused.\n */\nimport gql from 'graphql-tag'\n\nimport { client, uploadContext } from '@operato/graphql'\n\nexport type Audience = { scope: 'DOMAIN' | 'DEPARTMENT' | 'ROLE' | 'USER' | string; targetId: string; targetName?: string | null }\nexport type AnnouncementLink = { label: string; url: string }\nexport type FileRow = { id: string; name: string; fullpath: string; size?: number; mimetype?: string }\nexport type Receipt = { readAt?: string | null; acknowledgedAt?: string | null }\nexport type Delivery = { at: string; kind: string; receivers: number; email: { sent: number; failed: number }; teams: { sent: number; failed: number }; failed?: boolean }\n\nexport interface AnnouncementItem {\n id: string\n title: string\n body?: string | null\n category: string\n importance: 'NORMAL' | 'IMPORTANT' | 'URGENT' | string\n status: 'DRAFT' | 'SCHEDULED' | 'PUBLISHED' | 'WITHDRAWN' | string\n startsAt?: string | null\n endsAt?: string | null\n pinned: boolean\n requiresAcknowledgement: boolean\n acknowledgeBy?: string | null\n popup: boolean\n sendEmail?: boolean\n deliveries?: Delivery[] | null\n links?: AnnouncementLink[] | null\n version: number\n publishedAt?: string | null\n audienceSize?: number | null\n withdrawnAt?: string | null\n withdrawReason?: string | null\n readerState?: 'unread' | 'read' | 'to-acknowledge' | 'acknowledged'\n readCount?: number | null\n acknowledgedCount?: number | null\n editable?: boolean\n addressed?: boolean\n mine?: Receipt | null\n publisher?: { id: string; name?: string } | null\n creator?: { id: string; name?: string } | null\n audiences?: Audience[]\n attachments?: FileRow[]\n}\n\nexport interface AnnouncementInput {\n title: string\n body?: string\n category?: string\n importance?: string\n startsAt?: string | null\n endsAt?: string | null\n pinned?: boolean\n requiresAcknowledgement?: boolean\n acknowledgeBy?: string | null\n popup?: boolean\n sendEmail?: boolean\n links?: AnnouncementLink[]\n audiences?: Audience[]\n}\n\n/** The fields a list row needs. */\nexport const LIST_FIELDS = `id title category importance status startsAt endsAt pinned requiresAcknowledgement acknowledgeBy popup publishedAt version readerState publisher { id name }`\n\n/** Everything one announcement shows. */\nexport const FULL_FIELDS = `${LIST_FIELDS} body links sendEmail deliveries audienceSize withdrawnAt withdrawReason editable addressed mine { readAt acknowledgedAt }\n creator { id name } audiences { scope targetId targetName } attachments { id name fullpath size mimetype }`\n\nfunction answer<T>(response: any, field: string): T {\n if (response.errors?.length) throw new Error(response.errors.map((one: any) => one.message).join(' · '))\n return response.data?.[field] as T\n}\n\nasync function ask<T>(query: string, variables: Record<string, unknown>, field: string): Promise<T> {\n return answer<T>(await client.query({ query: gql(query), variables, fetchPolicy: 'network-only' }), field)\n}\n\nasync function change<T>(mutation: string, variables: Record<string, unknown>, field: string, uploading?: (fraction: number) => void): Promise<T> {\n return answer<T>(await client.mutate({ mutation: gql(mutation), variables, ...(uploading ? { context: uploadContext(uploading) } : {}) }), field)\n}\n\n/** Tells the badge and an open list that a reading changed. */\nexport const announcementsChanged = () => window.dispatchEvent(new CustomEvent('announcements-changed'))\n\nexport const announcementApi = {\n one: (id: string) => ask<AnnouncementItem | null>(`query ($id: String!) { announcement(id: $id) { ${FULL_FIELDS} readCount acknowledgedCount } }`, { id }, 'announcement'),\n summary: () => ask<{ unread: number; toAcknowledge: number; pending: number }>(`query { announcementSummary { unread toAcknowledge pending } }`, {}, 'announcementSummary'),\n popups: () => ask<AnnouncementItem[]>(`query { announcementPopups { ${FULL_FIELDS} } }`, {}, 'announcementPopups'),\n read: async (id: string) => {\n const one = await change<AnnouncementItem>(`mutation ($id: String!) { readAnnouncement(id: $id) { id readerState mine { readAt acknowledgedAt } } }`, { id }, 'readAnnouncement')\n announcementsChanged()\n return one\n },\n acknowledge: async (id: string) => {\n const one = await change<AnnouncementItem>(`mutation ($id: String!) { acknowledgeAnnouncement(id: $id) { id readerState mine { readAt acknowledgedAt } } }`, { id }, 'acknowledgeAnnouncement')\n announcementsChanged()\n return one\n },\n receipts: (id: string) =>\n ask<{ userId: string; name?: string; email?: string; listed: boolean; notifiedAt?: string; readAt?: string; acknowledgedAt?: string }[]>(\n `query ($id: String!) { announcementReceipts(id: $id) { userId name email listed notifiedAt readAt acknowledgedAt } }`,\n { id },\n 'announcementReceipts'\n ),\n revisions: (id: string) =>\n ask<{ version: number; title: string; body?: string; rest?: any; createdAt: string; creator?: { name?: string } }[]>(\n `query ($id: String!) { announcementRevisions(id: $id) { version title body rest createdAt creator { name } } }`,\n { id },\n 'announcementRevisions'\n ),\n choices: () =>\n ask<{ domainId: string; domainName: string; departments: { id: string; name: string; note?: string }[]; roles: { id: string; name: string; note?: string }[] }>(\n `query { announcementAudienceChoices { domainId domainName departments { id name note } roles { id name note } } }`,\n {},\n 'announcementAudienceChoices'\n ),\n people: (text: string) => ask<{ id: string; name: string; note?: string }[]>(`query ($text: String!) { announcementPeople(text: $text) { id name note } }`, { text }, 'announcementPeople'),\n audienceSize: (audiences: Audience[]) =>\n ask<number>(`query ($audiences: [AnnouncementAudienceInput!]!) { announcementAudienceSize(audiences: $audiences) }`, { audiences }, 'announcementAudienceSize'),\n create: (input: AnnouncementInput, attach: File[], uploading?: (fraction: number) => void) =>\n change<AnnouncementItem>(\n `mutation ($input: AnnouncementInput!, $attach: [Upload!]) { createAnnouncement(input: $input, attach: $attach) { id } }`,\n { input, attach },\n 'createAnnouncement',\n attach.length ? uploading ?? (() => {}) : undefined\n ),\n update: (id: string, input: AnnouncementInput, attach: File[], remove: string[], notifyAgain: boolean, uploading?: (fraction: number) => void) =>\n change<AnnouncementItem>(\n `mutation ($id: String!, $input: AnnouncementInput!, $attach: [Upload!], $remove: [String!], $notifyAgain: Boolean) {\n updateAnnouncement(id: $id, input: $input, attach: $attach, remove: $remove, notifyAgain: $notifyAgain) { id status }\n }`,\n { id, input, attach, remove, notifyAgain },\n 'updateAnnouncement',\n attach.length ? uploading ?? (() => {}) : undefined\n ),\n publish: (id: string) => change<AnnouncementItem>(`mutation ($id: String!) { publishAnnouncement(id: $id) { id status startsAt } }`, { id }, 'publishAnnouncement'),\n withdraw: (id: string, reason: string) =>\n change<AnnouncementItem>(`mutation ($id: String!, $reason: String!) { withdrawAnnouncement(id: $id, reason: $reason) { id status } }`, { id, reason }, 'withdrawAnnouncement'),\n remove: (id: string) => change<boolean>(`mutation ($id: String!) { deleteAnnouncement(id: $id) }`, { id }, 'deleteAnnouncement'),\n remind: (id: string) => change<number>(`mutation ($id: String!) { remindAnnouncement(id: $id) }`, { id }, 'remindAnnouncement')\n}\n"]}
|
|
1
|
+
{"version":3,"file":"announcement-api.js","sourceRoot":"","sources":["../../client/utils/announcement-api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,GAAG,MAAM,aAAa,CAAA;AAE7B,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAyDxD,mCAAmC;AACnC,MAAM,CAAC,MAAM,WAAW,GAAG,8JAA8J,CAAA;AAEzL,yCAAyC;AACzC,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,WAAW;6GACoE,CAAA;AAE7G,SAAS,MAAM,CAAI,QAAa,EAAE,KAAa;IAC7C,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IACxG,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAM,CAAA;AACpC,CAAC;AAED,KAAK,UAAU,GAAG,CAAI,KAAa,EAAE,SAAkC,EAAE,KAAa;IACpF,OAAO,MAAM,CAAI,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;AAC5G,CAAC;AAED,KAAK,UAAU,MAAM,CAAI,QAAgB,EAAE,SAAkC,EAAE,KAAa,EAAE,SAAsC;IAClI,OAAO,MAAM,CAAI,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;AACnJ,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,uBAAuB,CAAC,CAAC,CAAA;AAExG,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAA6D,gEAAgE,EAAE,EAAE,EAAE,qBAAqB,CAAC;IAC3K,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAqB,gCAAgC,WAAW,MAAM,EAAE,EAAE,EAAE,oBAAoB,CAAC;IAClH,IAAI,EAAE,KAAK,EAAE,EAAU,EAAE,EAAE;QACzB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAmB,yGAAyG,EAAE,EAAE,EAAE,EAAE,EAAE,kBAAkB,CAAC,CAAA;QACjL,oBAAoB,EAAE,CAAA;QACtB,OAAO,GAAG,CAAA;IACZ,CAAC;CACF,CAAA","sourcesContent":["/*\n * The announcement doors the editor, the badge and the popups call (ADR-0163). Every call throws the server's words when\n * it is refused. The other screens declare their own reads and saves (ADR-0190).\n */\nimport gql from 'graphql-tag'\n\nimport { client, uploadContext } from '@operato/graphql'\n\nexport type Audience = { scope: 'DOMAIN' | 'DEPARTMENT' | 'ROLE' | 'USER' | string; targetId: string; targetName?: string | null }\nexport type AnnouncementLink = { label: string; url: string }\nexport type FileRow = { id: string; name: string; fullpath: string; size?: number; mimetype?: string }\nexport type Receipt = { readAt?: string | null; acknowledgedAt?: string | null }\nexport type Delivery = { at: string; kind: string; receivers: number; email: { sent: number; failed: number }; teams: { sent: number; failed: number }; failed?: boolean }\n\nexport interface AnnouncementItem {\n id: string\n title: string\n body?: string | null\n category: string\n importance: 'NORMAL' | 'IMPORTANT' | 'URGENT' | string\n status: 'DRAFT' | 'SCHEDULED' | 'PUBLISHED' | 'WITHDRAWN' | string\n startsAt?: string | null\n endsAt?: string | null\n pinned: boolean\n requiresAcknowledgement: boolean\n acknowledgeBy?: string | null\n popup: boolean\n sendEmail?: boolean\n deliveries?: Delivery[] | null\n links?: AnnouncementLink[] | null\n version: number\n publishedAt?: string | null\n audienceSize?: number | null\n withdrawnAt?: string | null\n withdrawReason?: string | null\n readerState?: 'unread' | 'read' | 'to-acknowledge' | 'acknowledged'\n readCount?: number | null\n acknowledgedCount?: number | null\n editable?: boolean\n addressed?: boolean\n mine?: Receipt | null\n publisher?: { id: string; name?: string } | null\n creator?: { id: string; name?: string } | null\n audiences?: Audience[]\n attachments?: FileRow[]\n}\n\nexport interface AnnouncementInput {\n title: string\n body?: string\n category?: string\n importance?: string\n startsAt?: string | null\n endsAt?: string | null\n pinned?: boolean\n requiresAcknowledgement?: boolean\n acknowledgeBy?: string | null\n popup?: boolean\n sendEmail?: boolean\n links?: AnnouncementLink[]\n audiences?: Audience[]\n}\n\n/** The fields a list row needs. */\nexport const LIST_FIELDS = `id title category importance status startsAt endsAt pinned requiresAcknowledgement acknowledgeBy popup publishedAt version readerState publisher { id name }`\n\n/** Everything one announcement shows. */\nexport const FULL_FIELDS = `${LIST_FIELDS} body links sendEmail deliveries audienceSize withdrawnAt withdrawReason editable addressed mine { readAt acknowledgedAt }\n creator { id name } audiences { scope targetId targetName } attachments { id name fullpath size mimetype }`\n\nfunction answer<T>(response: any, field: string): T {\n if (response.errors?.length) throw new Error(response.errors.map((one: any) => one.message).join(' · '))\n return response.data?.[field] as T\n}\n\nasync function ask<T>(query: string, variables: Record<string, unknown>, field: string): Promise<T> {\n return answer<T>(await client.query({ query: gql(query), variables, fetchPolicy: 'network-only' }), field)\n}\n\nasync function change<T>(mutation: string, variables: Record<string, unknown>, field: string, uploading?: (fraction: number) => void): Promise<T> {\n return answer<T>(await client.mutate({ mutation: gql(mutation), variables, ...(uploading ? { context: uploadContext(uploading) } : {}) }), field)\n}\n\n/** Tells the badge and an open list that a reading changed. */\nexport const announcementsChanged = () => window.dispatchEvent(new CustomEvent('announcements-changed'))\n\nexport const announcementApi = {\n summary: () => ask<{ unread: number; toAcknowledge: number; pending: number }>(`query { announcementSummary { unread toAcknowledge pending } }`, {}, 'announcementSummary'),\n popups: () => ask<AnnouncementItem[]>(`query { announcementPopups { ${FULL_FIELDS} } }`, {}, 'announcementPopups'),\n read: async (id: string) => {\n const one = await change<AnnouncementItem>(`mutation ($id: String!) { readAnnouncement(id: $id) { id readerState mine { readAt acknowledgedAt } } }`, { id }, 'readAnnouncement')\n announcementsChanged()\n return one\n }\n}\n"]}
|
package/dist-server/index.d.ts
CHANGED
package/dist-server/index.js
CHANGED
|
@@ -17,4 +17,5 @@ for (const task of role_tasks_1.ROLE_TASKS)
|
|
|
17
17
|
(0, announcement_read_2.registerAnnouncementReads)();
|
|
18
18
|
/* Scheduled announcements go out at their start (ADR-0163 decision 4). */
|
|
19
19
|
process.on('bootstrap-module-start', () => (0, announcement_service_1.schedulePublishing)());
|
|
20
|
+
require("./work-doors");
|
|
20
21
|
//# sourceMappingURL=index.js.map
|
package/dist-server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;;AAAA,oDAAyB;AACzB,yDAAuF;AAA9E,2HAAA,sBAAsB,OAAA;AAAE,8HAAA,yBAAyB,OAAA;AAE1D,yDAA4D;AAE5D,2DAA+D;AAC/D,2DAA+D;AAC/D,6CAAyC;AACzC,sFAAgF;AAEhF,KAAK,MAAM,IAAI,IAAI,uBAAU;IAAE,IAAA,4BAAgB,EAAC,IAAI,CAAC,CAAA;AACrD,IAAA,6CAAyB,GAAE,CAAA;AAC3B,IAAA,6CAAyB,GAAE,CAAA;AAE3B,0EAA0E;AAC1E,OAAO,CAAC,EAAE,CAAC,wBAA+B,EAAE,GAAG,EAAE,CAAC,IAAA,yCAAkB,GAAE,CAAC,CAAA","sourcesContent":["export * from './service'\nexport { ANNOUNCEMENT_LIST_READ, ANNOUNCEMENT_READ_TARGETS } from './announcement-read'\n\nimport { registerRoleTask } from '@things-factory/auth-base'\n\nimport { registerAnnouncementReads } from './announcement-read'\nimport { registerAnnouncementFiles } from './attachment-reader'\nimport { ROLE_TASKS } from './role-tasks'\nimport { schedulePublishing } from './service/announcement/announcement-service'\n\nfor (const task of ROLE_TASKS) registerRoleTask(task)\nregisterAnnouncementFiles()\nregisterAnnouncementReads()\n\n/* Scheduled announcements go out at their start (ADR-0163 decision 4). */\nprocess.on('bootstrap-module-start' as any, () => schedulePublishing())\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;;AAAA,oDAAyB;AACzB,yDAAuF;AAA9E,2HAAA,sBAAsB,OAAA;AAAE,8HAAA,yBAAyB,OAAA;AAE1D,yDAA4D;AAE5D,2DAA+D;AAC/D,2DAA+D;AAC/D,6CAAyC;AACzC,sFAAgF;AAEhF,KAAK,MAAM,IAAI,IAAI,uBAAU;IAAE,IAAA,4BAAgB,EAAC,IAAI,CAAC,CAAA;AACrD,IAAA,6CAAyB,GAAE,CAAA;AAC3B,IAAA,6CAAyB,GAAE,CAAA;AAE3B,0EAA0E;AAC1E,OAAO,CAAC,EAAE,CAAC,wBAA+B,EAAE,GAAG,EAAE,CAAC,IAAA,yCAAkB,GAAE,CAAC,CAAA;AACvE,wBAAqB","sourcesContent":["export * from './service'\nexport { ANNOUNCEMENT_LIST_READ, ANNOUNCEMENT_READ_TARGETS } from './announcement-read'\n\nimport { registerRoleTask } from '@things-factory/auth-base'\n\nimport { registerAnnouncementReads } from './announcement-read'\nimport { registerAnnouncementFiles } from './attachment-reader'\nimport { ROLE_TASKS } from './role-tasks'\nimport { schedulePublishing } from './service/announcement/announcement-service'\n\nfor (const task of ROLE_TASKS) registerRoleTask(task)\nregisterAnnouncementFiles()\nregisterAnnouncementReads()\n\n/* Scheduled announcements go out at their start (ADR-0163 decision 4). */\nprocess.on('bootstrap-module-start' as any, () => schedulePublishing())\nimport './work-doors'\n"]}
|