@things-factory/board-ui 10.1.45 → 10.1.46
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/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/viewparts/board-basic-info.js +2 -23
- package/dist-client/viewparts/board-basic-info.js.map +1 -1
- package/dist-client/viewparts/board-info-link.js +1 -18
- package/dist-client/viewparts/board-info-link.js.map +1 -1
- package/dist-client/viewparts/board-info-template.js +1 -18
- package/dist-client/viewparts/board-info-template.js.map +1 -1
- package/dist-client/viewparts/board-template-info.d.ts +1 -0
- package/dist-client/viewparts/board-template-info.js +6 -11
- package/dist-client/viewparts/board-template-info.js.map +1 -1
- package/dist-client/viewparts/group-info-basic.d.ts +1 -0
- package/dist-client/viewparts/group-info-basic.js +6 -7
- package/dist-client/viewparts/group-info-basic.js.map +1 -1
- package/dist-client/viewparts/group-info-import.js +1 -1
- package/dist-client/viewparts/group-info-import.js.map +1 -1
- package/dist-client/viewparts/info-dialog-styles.js +12 -1
- package/dist-client/viewparts/info-dialog-styles.js.map +1 -1
- package/dist-client/viewparts/play-group-info-basic.d.ts +1 -0
- package/dist-client/viewparts/play-group-info-basic.js +6 -7
- package/dist-client/viewparts/play-group-info-basic.js.map +1 -1
- package/package.json +7 -7
|
@@ -163,11 +163,6 @@ let BoardInfo = class BoardInfo extends LitElement {
|
|
|
163
163
|
margin-top: 0;
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
-
[duplicate] .buttons {
|
|
167
|
-
border-top: 0;
|
|
168
|
-
padding-top: 0;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
166
|
/* The footer stays put while the body scrolls. */
|
|
172
167
|
[footer] {
|
|
173
168
|
flex: none;
|
|
@@ -176,13 +171,6 @@ let BoardInfo = class BoardInfo extends LitElement {
|
|
|
176
171
|
background: var(--info-dialog-surface, var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface)));
|
|
177
172
|
}
|
|
178
173
|
|
|
179
|
-
[footer] .buttons {
|
|
180
|
-
border-top: 0;
|
|
181
|
-
padding-top: 0;
|
|
182
|
-
margin-top: 0;
|
|
183
|
-
align-items: center;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
174
|
[footer] [more] {
|
|
187
175
|
position: relative;
|
|
188
176
|
}
|
|
@@ -217,15 +205,6 @@ let BoardInfo = class BoardInfo extends LitElement {
|
|
|
217
205
|
}
|
|
218
206
|
|
|
219
207
|
@media (pointer: coarse) {
|
|
220
|
-
[footer] {
|
|
221
|
-
padding: 0;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
[footer] .buttons {
|
|
225
|
-
margin: 0;
|
|
226
|
-
border-top: 0;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
208
|
[footer] [more] {
|
|
230
209
|
flex: 0 0 auto;
|
|
231
210
|
}
|
|
@@ -313,7 +292,7 @@ let BoardInfo = class BoardInfo extends LitElement {
|
|
|
313
292
|
</div>
|
|
314
293
|
|
|
315
294
|
<div footer>
|
|
316
|
-
<div
|
|
295
|
+
<div tools>
|
|
317
296
|
<span more>
|
|
318
297
|
<md-icon-button id="more-anchor" ?disabled=${!editable} @click=${() => (this.menu.open = !this.menu.open)}>
|
|
319
298
|
<md-icon>more_vert</md-icon>
|
|
@@ -417,7 +396,7 @@ let BoardInfo = class BoardInfo extends LitElement {
|
|
|
417
396
|
</label>
|
|
418
397
|
</div>
|
|
419
398
|
</div>
|
|
420
|
-
<div
|
|
399
|
+
<div tools>
|
|
421
400
|
<div filler></div>
|
|
422
401
|
<md-text-button cap @click=${() => (this.duplicating = false)}>${i18next.t('button.cancel')}</md-text-button>
|
|
423
402
|
<md-filled-button
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-basic-info.js","sourceRoot":"","sources":["../../client/viewparts/board-basic-info.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,yCAAyC,CAAA;AAChD,OAAO,uCAAuC,CAAA;AAC9C,OAAO,yCAAyC,CAAA;AAChD,OAAO,qCAAqC,CAAA;AAC5C,OAAO,iCAAiC,CAAA;AACxC,OAAO,oCAAoC,CAAA;AAC3C,OAAO,4BAA4B,CAAA;AACnC,OAAO,iCAAiC,CAAA;AACxC,OAAO,kCAAkC,CAAA;AACzC,OAAO,2CAA2C,CAAA;AAElD,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAA;AAEpE,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEI,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,UAAU;IAAlC;;QAsLI,mBAAc,GAAU,EAAE,CAAA;QAC1B,kBAAa,GAAU,EAAE,CAAA;QACzB,gBAAW,GAAY,KAAK,CAAA;QAC5B,mBAAc,GAAa,KAAK,CAAA;QAEjC,aAAQ,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAA;QAEjC,kBAAa,GAAsD,EAAE,CAAA;QACrE,iBAAY,GAAmC,EAAE,CAAA;IAof5D,CAAC;aAjrBQ,WAAM,GAAG;QACd,iBAAiB;QACjB,cAAc;QACd,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2KF;KACF,AA/KY,CA+KZ;IAsBD,MAAM;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAA;QACzE,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,EAAE,CAAA;QAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;QACzE,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAA;QAEtC,OAAO,IAAI,CAAA;QACP,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,cAAc,CAAC;;;;;cAKhC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;;;uBAGd,KAAK,CAAC,IAAI,IAAI,EAAE;wBACf,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;0BACzD,CAAC,QAAQ;;;;;cAKrB,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;;;uBAGrB,KAAK,CAAC,WAAW,IAAI,EAAE;wBACtB,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;0BAChE,CAAC,QAAQ;;;;;;gBAMnB,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;;yBAEpB,KAAK,CAAC,IAAI,IAAI,MAAM;2BAClB;YACT,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;YAC9D,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE;YAC5D,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE;SACjE;0BACS,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;4BAC9E,CAAC,QAAQ;;;;;gBAKrB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;;yBAEf,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE;0BACxB,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;4BAC5D,CAAC,QAAQ;;;kBAGnB,cAAc,CAAC,GAAG,CAClB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAA,iBAAiB,IAAI,CAAC,EAAE,cAAc,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI,WAAW,CACzG;;;;;;UAMP,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO;;+BAEnC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;;YAE3E,OAAO,CAAC,CAAC,CAAC,4CAA4C,EAAE;YACxD,YAAY,EAAE,wEAAwE;SACvF,CAAC;;;YAGA,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAC9B,IAAI,CAAC,EAAE,CAAC,IAAI,CAAA;;wBAEA,IAAI,CAAC,IAAI;4BACL,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;yBACxB,CAAC,CAAC,EAAE;YACX,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QAC1E,CAAC;;aAEJ,CACF;;;;;;;yDAO8C,CAAC,QAAQ,WAAW,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;;;;qCAIhF,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;uCAE7B,OAAO,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;;qCAE/D,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;;uCAEzB,OAAO,CAAC,CAAC,CAAC,oBAAoB,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC;;4CAE9D,CAAC,IAAI,CAAC,YAAY,WAAW,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;uCAE9D,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;kBAChD,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU;YAC/C,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,IAAI,CAAA;wBACA,OAAO,CAAC,CAAC,CAAC,0BAA0B,EAAE,EAAE,YAAY,EAAE,yBAAyB,EAAE,CAAC;2BAC/E;;;gDAGqB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;;uCAEpC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;;;;;0CAKvB,CAAC,QAAQ,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAC,kBAAkB,IAAI,CAAC,OAAO,EAAE,CAAC;4DAClD,OAAO,CAAC,CAAC,CAAC,sBAAsB,EAAE;YAChF,YAAY,EAAE,kBAAkB;SACjC,CAAC;;4CAE8B,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,WAAW,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;iDAC3D,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;;;;KAIpE,CAAA;IACH,CAAC;IAEO,UAAU,CAAC,KAAU,EAAE,cAAqB;QAClD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,KAAK,UAAU,CAAA;QAC3C,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC5E,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAA;QAChE,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,CAAA;QAEvD,OAAO,IAAI,CAAA;;+BAEgB,QAAQ;YAC3B,QAAQ;YACR,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;YAC3D,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;;iBAEhD,KAAK,CAAC,OAAO,IAAI,CAAC;UACzB,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA,gBAAgB,KAAK,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,OAAO;UAC7D,OAAO;YACP,CAAC,CAAC,IAAI,CAAA,aAAa,OAAO,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,OAAO,OAAO,QAAQ,GAAG,SAAS;YACjH,CAAC,CAAC,GAAG;gBACH,CAAC,CAAC,IAAI,CAAA,aAAa,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,IAAI,GAAG,SAAS;gBACzF,CAAC,CAAC,OAAO;;KAEhB,CAAA;IACH,CAAC;IAEO,eAAe,CAAC,KAAU;QAChC,MAAM,YAAY,GAChB,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI,CAAC,eAAe,CAAA;QAE9F,OAAO,IAAI,CAAA;;+BAEgB,OAAO,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;;YAE7E,OAAO,CAAC,CAAC,CAAC,qBAAqB,EAAE;YACjC,YAAY,EAAE,gGAAgG;SAC/G,CAAC;;;;;gBAKI,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;;0BAEf,CAAC,CAAC,EAAE;YACZ,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAA;YACrC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAC9C,CAAC;yBACQ,IAAI,CAAC,eAAe,IAAI,EAAE;;;kBAGjC,IAAI,CAAC,aAAa,CAAC,GAAG,CACtB,MAAM,CAAC,EAAE,CACP,IAAI,CAAA,iBAAiB,MAAM,CAAC,SAAS,cAAc,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,eAAe;wBACvF,MAAM,CAAC,IAAI;8BACL,CACb;;;;gBAID,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;gCACR,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,aAAa,IAAI,EAAE;;kBAE3F,IAAI,CAAC,YAAY,CAAC,GAAG,CACrB,KAAK,CAAC,EAAE,CAAC,IAAI,CAAA,iBAAiB,KAAK,CAAC,EAAE,cAAc,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,IAAI,WAAW,CAC5G;;;;;;;uCAOsB,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;;;wBAG7E,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,YAAY;qBAC/E,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;;yDAEU,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;;;;KAI5E,CAAA;IACH,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;QAC9E,IAAI,CAAC,cAAc,GAAG,MAAM,YAAY,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;QAEtF,IAAI,CAAC,OAAO,EAAE,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,QAAQ,GAAG,CACf,MAAM,MAAM,CAAC,KAAK,CAAC;YACjB,KAAK,EAAE,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAqDT;YACD,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE;SAChC,CAAC,CACH,CAAC,IAAI,CAAA;QAEN,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;QAC5B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,CAAA;QAE9B,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAA;QAChD,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;QAEjC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAA;QAC3C,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAA;QAE9C,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,oBAAoB,CAAA;QAClD,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAA;QACzC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,SAAkB;QACxC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAA;QACtB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAA;QAEvB,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAM;QACR,CAAC;QAED,MAAM,SAAS,GAAG,CAChB,MAAM,MAAM,CAAC,KAAK,CAAC;YACjB,KAAK,EAAE,GAAG,CAAA;;;;;;;;;;SAUT;YACD,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE;YAC/B,OAAO,EAAE;gBACP,OAAO,EAAE;oBACP,yBAAyB,EAAE,SAAS;iBACrC;aACF;SACF,CAAC,CACH,CAAC,IAAI,CAAA;QAEN,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAA;IAC5C,CAAC;IAED,8DAA8D;IAC9D,IAAI,OAAO;QACT,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,OAAO,KAAK,CAAA;QACd,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAA;QAEvD,OAAO,CACL,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI;YAC1B,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;YACxD,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;YAChD,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAC3B,CAAA;IACH,CAAC;IAED,IAAI,YAAY;QACd,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,UAAU,EAAE,CAAC;YAClD,OAAO,KAAK,CAAA;QACd,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,OAAO,CAAA;IACtB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YAC9H,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,mDAAmD,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;YAC7G,OAAM;QACR,CAAC;QAED,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAA;QAE5C,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,aAAa,EAAE;YAC7B,MAAM,EAAE;gBACN,EAAE;gBACF,IAAI;gBACJ,WAAW;gBACX,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,aAAa,EAAE,IAAI,CAAC,aAAa;aAClC;YACD,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAA;QAED,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAA;QAEpE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAC3C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAAC,CAAA;QAEzE,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAEzC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;QACxC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAA;QACnB,IAAI,CAAC,QAAQ,GAAG,GAAG,KAAK,CAAC,IAAI,OAAO,CAAA;QAEpC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QAE/B,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAA;QAEzB,uEAAuE;QACvE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACpC,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;YAC1C,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC;YACxD,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE;YAC5D,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE;SAC3D,CAAC,CAAA;QACF,IAAI,OAAO,KAAK,IAAI;YAAE,OAAM;QAE5B,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,eAAe,EAAE;YAC/B,MAAM,EAAE;gBACN,EAAE;gBACF,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,IAAI;aAChC;YACD,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAA;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAA;QAC3D,yBAAyB;QAEzB,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;YAC9B,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE;YAChD,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAA;QAED,+EAA+E;QAC/E,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;QACjC,IAAI,CAAC,aAAa,EAAE,CAAA;IACtB,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IACE,MAAM,QAAQ,CAAC,IAAI,CAAC;YAClB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;YACrC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC;YAClE,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE;YACpD,YAAY,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE;SACnD,CAAC,EACF,CAAC;YACD,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;gBAC9B,MAAM,EAAE,IAAI,CAAC,KAAK;gBAClB,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;aACf,CAAC,CACH,CAAA;YAED,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAK;QACvB,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,gBAAgB,EAAE;YAChC,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,SAAS,EAAE,KAAK;aACjB;YACD,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAA;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,KAAK;QACxB,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,iBAAiB,EAAE;YACjC,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,SAAS,EAAE,KAAK;aACjB;YACD,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAA;IACH,CAAC;IAED,KAAK;QACH,OAAO,CAAC,IAAI,EAAE,CAAA;IAChB,CAAC;;AA/f2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0CAAiB;AAChB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0CAAiB;AAEnC;IAAR,KAAK,EAAE;;wCAAW;AACV;IAAR,KAAK,EAAE;;iDAA2B;AAC1B;IAAR,KAAK,EAAE;;gDAA0B;AACzB;IAAR,KAAK,EAAE;;8CAA6B;AAC5B;IAAR,KAAK,EAAE;;iDAAiC;AAIhC;IAAR,KAAK,EAAE;;gDAAsE;AACrE;IAAR,KAAK,EAAE;;+CAAkD;AACjD;IAAR,KAAK,EAAE;;kDAAyB;AACxB;IAAR,KAAK,EAAE;;gDAAuB;AAEL;IAAzB,KAAK,CAAC,SAAS,CAAC;;uCAAmB;AAlMzB,SAAS;IADrB,aAAa,CAAC,kBAAkB,CAAC;GACrB,SAAS,CAkrBrB","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/iconbutton/icon-button.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/outlined-button.js'\nimport '@material/web/button/text-button.js'\nimport '@material/web/chips/chip-set.js'\nimport '@material/web/chips/filter-chip.js'\nimport '@material/web/menu/menu.js'\nimport '@material/web/menu/menu-item.js'\nimport '@material/web/divider/divider.js'\nimport '@operato/input/ox-input-select-buttons.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { i18next } from '@operato/i18n'\nimport { client } from '@operato/graphql'\nimport { navigate, AppController } from '@operato/shell'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\nimport { CommonPopupStyles } from '@operato/styles'\nimport { hasPrivilege } from '@things-factory/auth-base/dist-client'\n\nimport { notify } from '../utils/notify-helper.js'\nimport { timeAgo } from '../utils/board-meta.js'\nimport { InfoFormStyles } from './info-dialog-styles.js'\n\n/**\n * The basic tab of the board dialog.\n *\n * ## The shape, and why\n *\n * Three kinds of thing used to share one scrolling form: fields that wait for Save, actions that\n * happen the moment you touch them (release, join a play group), and a copy-to-domain panel hidden\n * behind a caret next to the name. The Save button sat in the middle of all that and scrolled out\n * of view on a short screen.\n *\n * Now the dialog reads top to bottom as: what this is (a status band), what you can change (the\n * form, committed by Save), where it plays (membership chips, which apply at once and say so), and\n * a footer that never scrolls away: the primary Save, the way into the modeller, and everything\n * else - duplicate, export, release, delete - behind one \"more\" menu so the footer stays two\n * buttons wide. Duplicate opens its own small panel with its own Copy and Cancel.\n *\n * ## Colour\n *\n * The accent (board's earth brown) is spent on three things only: the filled Save, the selected\n * segment, and the pressed play-group chip. Everything else is the neutral scale - the status band\n * is a low surface, the draft pill a warm secondary container, released a soft tertiary green -\n * so the one thing you are meant to press is the one thing in colour.\n */\n@customElement('board-basic-info')\nexport class BoardInfo extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n padding: 0;\n gap: 0;\n background: var(--info-dialog-surface, var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface)));\n }\n\n /* What this is: state, version, freshness, home group - one quiet line under the tabs. */\n .what {\n flex: none;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px 10px;\n margin: var(--spacing-medium, 8px) var(--popup-padding) 0;\n padding: 7px 10px;\n border-radius: var(--md-sys-shape-corner-small, 6px);\n background: var(--md-sys-color-surface-container-low);\n color: var(--md-sys-color-on-surface-variant);\n font-size: var(--popup-font-size-small);\n }\n\n .what [pill] {\n padding: 1px 8px;\n border-radius: 999px;\n font-size: 0.66rem;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--md-sys-color-on-secondary-container);\n background: var(--md-sys-color-secondary-container);\n }\n\n .what [pill][released] {\n color: var(--md-sys-color-on-tertiary-container);\n background: var(--md-sys-color-tertiary-container);\n }\n\n .what [dot]::before {\n content: '·';\n margin-right: 10px;\n color: var(--md-sys-color-outline);\n }\n\n .what b {\n font-weight: 500;\n color: var(--md-sys-color-on-surface);\n }\n\n [body] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-medium, 8px);\n padding: var(--spacing-medium, 8px) var(--popup-padding) var(--popup-padding);\n }\n\n .fields .row {\n display: flex;\n gap: var(--spacing-medium, 8px);\n }\n\n .fields .row > label {\n flex: 1;\n min-width: 0;\n }\n\n /* A choice of three reads faster as a segmented row than as three radios with labels. */\n ox-input-select-buttons {\n --md-filter-chip-container-height: 30px;\n --md-filter-chip-label-text-size: 0.76rem;\n }\n\n .chips {\n --md-filter-chip-container-height: 28px;\n --md-filter-chip-label-text-size: 0.74rem;\n --md-filter-chip-outline-color: var(--md-sys-color-outline-variant);\n --md-filter-chip-label-text-color: var(--md-sys-color-on-surface-variant);\n --md-filter-chip-selected-container-color: var(--md-sys-color-primary-container);\n --md-filter-chip-selected-label-text-color: var(--md-sys-color-on-primary-container);\n --md-filter-chip-selected-leading-icon-color: var(--md-sys-color-on-primary-container);\n }\n\n /* The duplicate panel is a small task inside the dialog: inset, with its own commit. */\n [duplicate] {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-medium, 8px);\n padding: var(--spacing-medium, 8px) var(--spacing-medium, 8px) var(--spacing-small, 4px);\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: var(--md-sys-shape-corner-small, 6px);\n background: var(--md-sys-color-surface-container-low);\n }\n\n [duplicate] .section {\n margin-top: 0;\n }\n\n [duplicate] .buttons {\n border-top: 0;\n padding-top: 0;\n }\n\n /* The footer stays put while the body scrolls. */\n [footer] {\n flex: none;\n padding: var(--spacing-medium, 8px) var(--popup-padding);\n border-top: 1px solid var(--md-sys-color-outline-variant);\n background: var(--info-dialog-surface, var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface)));\n }\n\n [footer] .buttons {\n border-top: 0;\n padding-top: 0;\n margin-top: 0;\n align-items: center;\n }\n\n [footer] [more] {\n position: relative;\n }\n\n md-menu {\n min-width: 220px;\n --md-menu-container-color: var(--md-sys-color-surface-container-lowest, #fff);\n --md-menu-container-shape: 10px;\n --md-menu-item-one-line-container-height: 40px;\n --md-menu-item-two-line-container-height: 52px;\n --md-menu-item-label-text-size: 0.84rem;\n --md-menu-item-supporting-text-size: 0.72rem;\n --md-menu-item-leading-space: 14px;\n --md-menu-item-trailing-space: 14px;\n }\n\n md-menu-item[cap] [slot='headline'] {\n text-transform: capitalize;\n }\n\n md-menu-item md-icon[slot='start'] {\n --md-icon-size: 18px;\n }\n\n md-menu-item[danger] {\n --md-menu-item-label-text-color: var(--md-sys-color-error);\n --md-menu-item-leading-icon-color: var(--md-sys-color-error);\n }\n\n md-icon-button {\n --md-icon-button-icon-color: var(--md-sys-color-on-surface-variant);\n }\n\n @media (pointer: coarse) {\n [footer] {\n padding: 0;\n }\n\n [footer] .buttons {\n margin: 0;\n border-top: 0;\n }\n\n [footer] [more] {\n flex: 0 0 auto;\n }\n }\n `\n ]\n\n @property({ type: String }) boardId?: string\n @property({ type: String }) groupId?: string\n\n @state() board: any\n @state() boardGroupList: any[] = []\n @state() playGroupList: any[] = []\n @state() duplicating: boolean = false\n @state() enableModeller?: boolean = false\n\n private _appCtrl = new AppController(this)\n\n @state() targetDomains: { id: string; name: string; subdomain: string }[] = []\n @state() targetGroups: { id: string; name: string }[] = []\n @state() targetSubdomain?: string\n @state() targetGroupId?: string\n\n @query('md-menu') private menu!: any\n\n private original: any\n\n render() {\n const board = this.board || { name: '', description: '', playGroups: [] }\n const boardGroupList = this.boardGroupList || []\n const memberOf = new Set((board.playGroups || []).map(group => group.id))\n const editable = !!this.enableModeller\n\n return html`\n ${this.renderWhat(board, boardGroupList)}\n\n <div body>\n <div class=\"fields\">\n <label>\n ${i18next.t('label.name')}\n <input\n type=\"text\"\n .value=${board.name || ''}\n @change=${e => (this.board = { ...this.board, name: e.target.value })}\n ?disabled=${!editable}\n />\n </label>\n\n <label>\n ${i18next.t('label.description')}\n <input\n type=\"text\"\n .value=${board.description || ''}\n @change=${e => (this.board = { ...this.board, description: e.target.value })}\n ?disabled=${!editable}\n />\n </label>\n\n <div class=\"row\">\n <label>\n ${i18next.t('label.board-type')}\n <ox-input-select-buttons\n .value=${board.type || 'main'}\n .options=${[\n { display: i18next.t('label.board-type-main'), value: 'main' },\n { display: i18next.t('label.board-type-sub'), value: 'sub' },\n { display: i18next.t('label.board-type-popup'), value: 'popup' }\n ]}\n @change=${(e: CustomEvent) => e.detail && (this.board = { ...this.board, type: e.detail })}\n ?disabled=${!editable}\n ></ox-input-select-buttons>\n </label>\n\n <label>\n ${i18next.t('label.group')}\n <select\n .value=${this.board?.groupId || ''}\n @change=${e => (this.board = { ...this.board, groupId: e.target.value })}\n ?disabled=${!editable}\n >\n <option value=\"\"></option>\n ${boardGroupList.map(\n item => html`<option value=${item.id} ?selected=${item.id == this.board?.groupId}>${item.name}</option>`\n )}\n </select>\n </label>\n </div>\n </div>\n\n ${this.duplicating ? this.renderDuplicate(board) : nothing}\n\n <div class=\"section\">${i18next.t('text.plays in', { defaultValue: 'Plays in' })}</div>\n <div class=\"note\">\n ${i18next.t('text.play-group membership applies at once', {\n defaultValue: 'Tap a play group to add or remove this board. This applies right away.'\n })}\n </div>\n <md-chip-set class=\"chips\">\n ${(this.playGroupList || []).map(\n item => html`\n <md-filter-chip\n label=${item.name}\n ?selected=${memberOf.has(item.id)}\n @click=${e => {\n e.target.selected ? this.joinPlayGroup(item) : this.leavePlayGroup(item)\n }}\n ></md-filter-chip>\n `\n )}\n </md-chip-set>\n </div>\n\n <div footer>\n <div class=\"buttons\">\n <span more>\n <md-icon-button id=\"more-anchor\" ?disabled=${!editable} @click=${() => (this.menu.open = !this.menu.open)}>\n <md-icon>more_vert</md-icon>\n </md-icon-button>\n <md-menu anchor=\"more-anchor\" positioning=\"popover\" anchor-corner=\"start-start\" menu-corner=\"end-start\">\n <md-menu-item @click=${() => (this.duplicating = true)}>\n <md-icon slot=\"start\">content_copy</md-icon>\n <div slot=\"headline\">${i18next.t('button.duplicate', { defaultValue: 'Duplicate…' })}</div>\n </md-menu-item>\n <md-menu-item @click=${this.exportBoard.bind(this)}>\n <md-icon slot=\"start\">download</md-icon>\n <div slot=\"headline\">${i18next.t('button.export-json', { defaultValue: 'Export as JSON' })}</div>\n </md-menu-item>\n <md-menu-item cap ?disabled=${!this.isReleasable} @click=${this.releaseBoard.bind(this)}>\n <md-icon slot=\"start\">new_releases</md-icon>\n <div slot=\"headline\">${i18next.t('button.release')}</div>\n ${this.isReleasable || board.state === 'released'\n ? nothing\n : html`<div slot=\"supporting-text\">\n ${i18next.t('text.save before release', { defaultValue: 'Save your changes first' })}\n </div>`}\n </md-menu-item>\n <md-divider></md-divider>\n <md-menu-item cap danger @click=${this.deleteBoard.bind(this)}>\n <md-icon slot=\"start\">delete_outline</md-icon>\n <div slot=\"headline\">${i18next.t('button.delete')}</div>\n </md-menu-item>\n </md-menu>\n </span>\n <div filler></div>\n <md-outlined-button ?disabled=${!editable} @click=${() => navigate(`board-modeller/${this.boardId}`)}>\n <md-icon slot=\"icon\">design_services</md-icon>${i18next.t('button.open-modeller', {\n defaultValue: 'Open in modeller'\n })}\n </md-outlined-button>\n <md-filled-button cap ?disabled=${!editable || !this.isDirty} @click=${this.updateBoard.bind(this)}>\n <md-icon slot=\"icon\">save</md-icon>${i18next.t('button.save')}\n </md-filled-button>\n </div>\n </div>\n `\n }\n\n private renderWhat(board: any, boardGroupList: any[]) {\n if (!this.board) {\n return nothing\n }\n\n const released = board.state === 'released'\n const group = boardGroupList.find(item => item.id == this.original?.groupId)\n const updater = board.updater?.name || board.creator?.name || ''\n const ago = timeAgo(board.updatedAt || board.createdAt)\n\n return html`\n <div class=\"what\">\n <span pill ?released=${released}>\n ${released\n ? i18next.t('label.released', { defaultValue: 'released' })\n : i18next.t('label.draft', { defaultValue: 'draft' })}\n </span>\n <span>v${board.version ?? 0}</span>\n ${group ? html`<span dot><b>${group.name}</b></span>` : nothing}\n ${updater\n ? html`<span dot>${i18next.t('text.updated by', { defaultValue: 'updated by' })} <b>${updater}</b> ${ago}</span>`\n : ago\n ? html`<span dot>${i18next.t('text.updated', { defaultValue: 'updated' })} ${ago}</span>`\n : nothing}\n </div>\n `\n }\n\n private renderDuplicate(board: any) {\n const sameAsSource =\n this.original?.name == board.name && this._appCtrl.domain?.subdomain == this.targetSubdomain\n\n return html`\n <div duplicate>\n <div class=\"section\">${i18next.t('text.duplicate', { defaultValue: 'Duplicate' })}</div>\n <div class=\"note\">\n ${i18next.t('text.duplicate hint', {\n defaultValue: 'Copies this board into a domain and group. Give it a new name when copying within this domain.'\n })}\n </div>\n <div class=\"fields\">\n <div class=\"row\">\n <label>\n ${i18next.t('label.domain')}\n <select\n @change=${e => {\n this.targetSubdomain = e.target.value\n this.getGroupsByDomain(this.targetSubdomain)\n }}\n .value=${this.targetSubdomain || ''}\n >\n <option value=\"\"></option>\n ${this.targetDomains.map(\n domain =>\n html`<option value=${domain.subdomain} ?selected=${domain.subdomain == this.targetSubdomain}>\n ${domain.name}\n </option>`\n )}\n </select>\n </label>\n <label>\n ${i18next.t('label.group')}\n <select @change=${e => (this.targetGroupId = e.target.value)} .value=${this.targetGroupId || ''}>\n <option value=\"\"></option>\n ${this.targetGroups.map(\n group => html`<option value=${group.id} ?selected=${group.id == this.targetGroupId}>${group.name}</option>`\n )}\n </select>\n </label>\n </div>\n </div>\n <div class=\"buttons\">\n <div filler></div>\n <md-text-button cap @click=${() => (this.duplicating = false)}>${i18next.t('button.cancel')}</md-text-button>\n <md-filled-button\n cap\n ?disabled=${!this.original?.name || !board.name || !this.targetSubdomain || sameAsSource}\n @click=${this.cloneBoard.bind(this)}\n >\n <md-icon slot=\"icon\">content_copy</md-icon>${i18next.t('button.copy')}\n </md-filled-button>\n </div>\n </div>\n `\n }\n\n async firstUpdated() {\n this.targetSubdomain = this.targetSubdomain ?? this._appCtrl.domain?.subdomain\n this.enableModeller = await hasPrivilege({ privilege: 'mutation', category: 'board' })\n\n this.refresh()\n }\n\n async refresh() {\n const response = (\n await client.query({\n query: gql`\n query FetchBoardById($id: String!) {\n board(id: $id) {\n id\n name\n description\n model\n group {\n id\n name\n }\n playGroups {\n id\n name\n }\n thumbnail\n createdAt\n creator {\n id\n name\n }\n type\n state\n version\n updatedAt\n updater {\n id\n name\n }\n }\n\n groups {\n items {\n id\n name\n description\n }\n }\n\n playGroups {\n items {\n id\n name\n description\n }\n total\n }\n\n domainsWithPrivilege(privilege: \"mutation\", category: \"board\") {\n name\n subdomain\n }\n }\n `,\n variables: { id: this.boardId }\n })\n ).data\n\n const board = response.board\n this.groupId = board.group?.id\n\n this.board = { ...board, groupId: this.groupId }\n this.original = { ...this.board }\n\n this.boardGroupList = response.groups.items\n this.playGroupList = response.playGroups.items\n\n this.targetDomains = response.domainsWithPrivilege\n this.targetGroups = response.groups.items\n this.targetGroupId = this.groupId\n }\n\n async getGroupsByDomain(subdomain?: string) {\n this.targetGroups = []\n this.targetGroupId = ''\n\n if (!subdomain) {\n return\n }\n\n const response2 = (\n await client.query({\n query: gql`\n query {\n groups {\n items {\n id\n name\n description\n }\n }\n }\n `,\n variables: { id: this.boardId },\n context: {\n headers: {\n 'x-things-factory-domain': subdomain\n }\n }\n })\n ).data\n\n this.targetGroups = response2.groups.items\n }\n\n /** Something in the form differs from what the server has. */\n get isDirty() {\n if (!this.board || !this.original) {\n return false\n }\n\n const { name, description, groupId, type } = this.board\n\n return (\n this.original.name != name ||\n (this.original.description || '') != (description || '') ||\n (this.original.groupId || '') != (groupId || '') ||\n this.original.type != type\n )\n }\n\n get isReleasable() {\n if (!this.board || this.board.state == 'released') {\n return false\n }\n\n return !this.isDirty\n }\n\n async cloneBoard() {\n if (!this.original.name || (this.board.name == this.original.name && this._appCtrl.domain?.subdomain == this.targetSubdomain)) {\n notify('error', i18next.t('error.name must be unique from the original board', { name: this.original.name }))\n return\n }\n\n const { id, name, description } = this.board\n\n this.dispatchEvent(\n new CustomEvent('clone-board', {\n detail: {\n id,\n name,\n description,\n targetSubdomain: this.targetSubdomain,\n targetGroupId: this.targetGroupId\n },\n bubbles: true,\n composed: true\n })\n )\n\n this.close()\n }\n\n async exportBoard() {\n const board = { ...this.board, model: JSON.parse(this.board.model) }\n\n const json = JSON.stringify(board, null, 2)\n const blob = new Blob([json], { type: 'application/json;charset=utf-8' })\n\n const blobUrl = URL.createObjectURL(blob)\n\n const link = document.createElement('a')\n link.href = blobUrl\n link.download = `${board.name}.json`\n\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n\n URL.revokeObjectURL(blobUrl)\n }\n\n async releaseBoard() {\n const { id } = this.board\n\n // 릴리즈 코멘트(선택) 입력 — OxPrompt.prompt(모달, native prompt 대체). 취소 시 릴리즈 중단.\n const comment = await OxPrompt.prompt({\n type: 'question',\n title: String(i18next.t('button.release')),\n text: String(i18next.t('text.release comment optional')),\n multiline: true,\n confirmButton: { text: String(i18next.t('button.release')) },\n cancelButton: { text: String(i18next.t('button.cancel')) }\n })\n if (comment === null) return\n\n this.dispatchEvent(\n new CustomEvent('release-board', {\n detail: {\n id,\n comment: comment.trim() || null\n },\n bubbles: true,\n composed: true\n })\n )\n }\n\n async updateBoard() {\n const { id, name, description, groupId, type } = this.board\n /* model 정보를 제외하고 업데이트 */\n\n this.dispatchEvent(\n new CustomEvent('update-board', {\n detail: { id, name, description, groupId, type },\n bubbles: true,\n composed: true\n })\n )\n\n /* The form is what the server now has; Save goes quiet until the next edit. */\n this.original = { ...this.board }\n this.requestUpdate()\n }\n\n async deleteBoard() {\n if (\n await OxPrompt.open({\n title: i18next.t('text.are_you_sure'),\n text: i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }),\n confirmButton: { text: i18next.t('button.confirm') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n ) {\n this.dispatchEvent(\n new CustomEvent('delete-board', {\n detail: this.board,\n bubbles: true,\n composed: true\n })\n )\n\n this.close()\n }\n }\n\n async joinPlayGroup(group) {\n this.dispatchEvent(\n new CustomEvent('join-playgroup', {\n detail: {\n board: this.board,\n playGroup: group\n },\n bubbles: true,\n composed: true\n })\n )\n }\n\n async leavePlayGroup(group) {\n this.dispatchEvent(\n new CustomEvent('leave-playgroup', {\n detail: {\n board: this.board,\n playGroup: group\n },\n bubbles: true,\n composed: true\n })\n )\n }\n\n close() {\n history.back()\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"board-basic-info.js","sourceRoot":"","sources":["../../client/viewparts/board-basic-info.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/iconbutton/icon-button.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/outlined-button.js'\nimport '@material/web/button/text-button.js'\nimport '@material/web/chips/chip-set.js'\nimport '@material/web/chips/filter-chip.js'\nimport '@material/web/menu/menu.js'\nimport '@material/web/menu/menu-item.js'\nimport '@material/web/divider/divider.js'\nimport '@operato/input/ox-input-select-buttons.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { i18next } from '@operato/i18n'\nimport { client } from '@operato/graphql'\nimport { navigate, AppController } from '@operato/shell'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\nimport { CommonPopupStyles } from '@operato/styles'\nimport { hasPrivilege } from '@things-factory/auth-base/dist-client'\n\nimport { notify } from '../utils/notify-helper.js'\nimport { timeAgo } from '../utils/board-meta.js'\nimport { InfoFormStyles } from './info-dialog-styles.js'\n\n/**\n * The basic tab of the board dialog.\n *\n * ## The shape, and why\n *\n * Three kinds of thing used to share one scrolling form: fields that wait for Save, actions that\n * happen the moment you touch them (release, join a play group), and a copy-to-domain panel hidden\n * behind a caret next to the name. The Save button sat in the middle of all that and scrolled out\n * of view on a short screen.\n *\n * Now the dialog reads top to bottom as: what this is (a status band), what you can change (the\n * form, committed by Save), where it plays (membership chips, which apply at once and say so), and\n * a footer that never scrolls away: the primary Save, the way into the modeller, and everything\n * else - duplicate, export, release, delete - behind one \"more\" menu so the footer stays two\n * buttons wide. Duplicate opens its own small panel with its own Copy and Cancel.\n *\n * ## Colour\n *\n * The accent (board's earth brown) is spent on three things only: the filled Save, the selected\n * segment, and the pressed play-group chip. Everything else is the neutral scale - the status band\n * is a low surface, the draft pill a warm secondary container, released a soft tertiary green -\n * so the one thing you are meant to press is the one thing in colour.\n */\n@customElement('board-basic-info')\nexport class BoardInfo extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n padding: 0;\n gap: 0;\n background: var(--info-dialog-surface, var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface)));\n }\n\n /* What this is: state, version, freshness, home group - one quiet line under the tabs. */\n .what {\n flex: none;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px 10px;\n margin: var(--spacing-medium, 8px) var(--popup-padding) 0;\n padding: 7px 10px;\n border-radius: var(--md-sys-shape-corner-small, 6px);\n background: var(--md-sys-color-surface-container-low);\n color: var(--md-sys-color-on-surface-variant);\n font-size: var(--popup-font-size-small);\n }\n\n .what [pill] {\n padding: 1px 8px;\n border-radius: 999px;\n font-size: 0.66rem;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--md-sys-color-on-secondary-container);\n background: var(--md-sys-color-secondary-container);\n }\n\n .what [pill][released] {\n color: var(--md-sys-color-on-tertiary-container);\n background: var(--md-sys-color-tertiary-container);\n }\n\n .what [dot]::before {\n content: '·';\n margin-right: 10px;\n color: var(--md-sys-color-outline);\n }\n\n .what b {\n font-weight: 500;\n color: var(--md-sys-color-on-surface);\n }\n\n [body] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-medium, 8px);\n padding: var(--spacing-medium, 8px) var(--popup-padding) var(--popup-padding);\n }\n\n .fields .row {\n display: flex;\n gap: var(--spacing-medium, 8px);\n }\n\n .fields .row > label {\n flex: 1;\n min-width: 0;\n }\n\n /* A choice of three reads faster as a segmented row than as three radios with labels. */\n ox-input-select-buttons {\n --md-filter-chip-container-height: 30px;\n --md-filter-chip-label-text-size: 0.76rem;\n }\n\n .chips {\n --md-filter-chip-container-height: 28px;\n --md-filter-chip-label-text-size: 0.74rem;\n --md-filter-chip-outline-color: var(--md-sys-color-outline-variant);\n --md-filter-chip-label-text-color: var(--md-sys-color-on-surface-variant);\n --md-filter-chip-selected-container-color: var(--md-sys-color-primary-container);\n --md-filter-chip-selected-label-text-color: var(--md-sys-color-on-primary-container);\n --md-filter-chip-selected-leading-icon-color: var(--md-sys-color-on-primary-container);\n }\n\n /* The duplicate panel is a small task inside the dialog: inset, with its own commit. */\n [duplicate] {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-medium, 8px);\n padding: var(--spacing-medium, 8px) var(--spacing-medium, 8px) var(--spacing-small, 4px);\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: var(--md-sys-shape-corner-small, 6px);\n background: var(--md-sys-color-surface-container-low);\n }\n\n [duplicate] .section {\n margin-top: 0;\n }\n\n /* The footer stays put while the body scrolls. */\n [footer] {\n flex: none;\n padding: var(--spacing-medium, 8px) var(--popup-padding);\n border-top: 1px solid var(--md-sys-color-outline-variant);\n background: var(--info-dialog-surface, var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface)));\n }\n\n [footer] [more] {\n position: relative;\n }\n\n md-menu {\n min-width: 220px;\n --md-menu-container-color: var(--md-sys-color-surface-container-lowest, #fff);\n --md-menu-container-shape: 10px;\n --md-menu-item-one-line-container-height: 40px;\n --md-menu-item-two-line-container-height: 52px;\n --md-menu-item-label-text-size: 0.84rem;\n --md-menu-item-supporting-text-size: 0.72rem;\n --md-menu-item-leading-space: 14px;\n --md-menu-item-trailing-space: 14px;\n }\n\n md-menu-item[cap] [slot='headline'] {\n text-transform: capitalize;\n }\n\n md-menu-item md-icon[slot='start'] {\n --md-icon-size: 18px;\n }\n\n md-menu-item[danger] {\n --md-menu-item-label-text-color: var(--md-sys-color-error);\n --md-menu-item-leading-icon-color: var(--md-sys-color-error);\n }\n\n md-icon-button {\n --md-icon-button-icon-color: var(--md-sys-color-on-surface-variant);\n }\n\n @media (pointer: coarse) {\n [footer] [more] {\n flex: 0 0 auto;\n }\n }\n `\n ]\n\n @property({ type: String }) boardId?: string\n @property({ type: String }) groupId?: string\n\n @state() board: any\n @state() boardGroupList: any[] = []\n @state() playGroupList: any[] = []\n @state() duplicating: boolean = false\n @state() enableModeller?: boolean = false\n\n private _appCtrl = new AppController(this)\n\n @state() targetDomains: { id: string; name: string; subdomain: string }[] = []\n @state() targetGroups: { id: string; name: string }[] = []\n @state() targetSubdomain?: string\n @state() targetGroupId?: string\n\n @query('md-menu') private menu!: any\n\n private original: any\n\n render() {\n const board = this.board || { name: '', description: '', playGroups: [] }\n const boardGroupList = this.boardGroupList || []\n const memberOf = new Set((board.playGroups || []).map(group => group.id))\n const editable = !!this.enableModeller\n\n return html`\n ${this.renderWhat(board, boardGroupList)}\n\n <div body>\n <div class=\"fields\">\n <label>\n ${i18next.t('label.name')}\n <input\n type=\"text\"\n .value=${board.name || ''}\n @change=${e => (this.board = { ...this.board, name: e.target.value })}\n ?disabled=${!editable}\n />\n </label>\n\n <label>\n ${i18next.t('label.description')}\n <input\n type=\"text\"\n .value=${board.description || ''}\n @change=${e => (this.board = { ...this.board, description: e.target.value })}\n ?disabled=${!editable}\n />\n </label>\n\n <div class=\"row\">\n <label>\n ${i18next.t('label.board-type')}\n <ox-input-select-buttons\n .value=${board.type || 'main'}\n .options=${[\n { display: i18next.t('label.board-type-main'), value: 'main' },\n { display: i18next.t('label.board-type-sub'), value: 'sub' },\n { display: i18next.t('label.board-type-popup'), value: 'popup' }\n ]}\n @change=${(e: CustomEvent) => e.detail && (this.board = { ...this.board, type: e.detail })}\n ?disabled=${!editable}\n ></ox-input-select-buttons>\n </label>\n\n <label>\n ${i18next.t('label.group')}\n <select\n .value=${this.board?.groupId || ''}\n @change=${e => (this.board = { ...this.board, groupId: e.target.value })}\n ?disabled=${!editable}\n >\n <option value=\"\"></option>\n ${boardGroupList.map(\n item => html`<option value=${item.id} ?selected=${item.id == this.board?.groupId}>${item.name}</option>`\n )}\n </select>\n </label>\n </div>\n </div>\n\n ${this.duplicating ? this.renderDuplicate(board) : nothing}\n\n <div class=\"section\">${i18next.t('text.plays in', { defaultValue: 'Plays in' })}</div>\n <div class=\"note\">\n ${i18next.t('text.play-group membership applies at once', {\n defaultValue: 'Tap a play group to add or remove this board. This applies right away.'\n })}\n </div>\n <md-chip-set class=\"chips\">\n ${(this.playGroupList || []).map(\n item => html`\n <md-filter-chip\n label=${item.name}\n ?selected=${memberOf.has(item.id)}\n @click=${e => {\n e.target.selected ? this.joinPlayGroup(item) : this.leavePlayGroup(item)\n }}\n ></md-filter-chip>\n `\n )}\n </md-chip-set>\n </div>\n\n <div footer>\n <div tools>\n <span more>\n <md-icon-button id=\"more-anchor\" ?disabled=${!editable} @click=${() => (this.menu.open = !this.menu.open)}>\n <md-icon>more_vert</md-icon>\n </md-icon-button>\n <md-menu anchor=\"more-anchor\" positioning=\"popover\" anchor-corner=\"start-start\" menu-corner=\"end-start\">\n <md-menu-item @click=${() => (this.duplicating = true)}>\n <md-icon slot=\"start\">content_copy</md-icon>\n <div slot=\"headline\">${i18next.t('button.duplicate', { defaultValue: 'Duplicate…' })}</div>\n </md-menu-item>\n <md-menu-item @click=${this.exportBoard.bind(this)}>\n <md-icon slot=\"start\">download</md-icon>\n <div slot=\"headline\">${i18next.t('button.export-json', { defaultValue: 'Export as JSON' })}</div>\n </md-menu-item>\n <md-menu-item cap ?disabled=${!this.isReleasable} @click=${this.releaseBoard.bind(this)}>\n <md-icon slot=\"start\">new_releases</md-icon>\n <div slot=\"headline\">${i18next.t('button.release')}</div>\n ${this.isReleasable || board.state === 'released'\n ? nothing\n : html`<div slot=\"supporting-text\">\n ${i18next.t('text.save before release', { defaultValue: 'Save your changes first' })}\n </div>`}\n </md-menu-item>\n <md-divider></md-divider>\n <md-menu-item cap danger @click=${this.deleteBoard.bind(this)}>\n <md-icon slot=\"start\">delete_outline</md-icon>\n <div slot=\"headline\">${i18next.t('button.delete')}</div>\n </md-menu-item>\n </md-menu>\n </span>\n <div filler></div>\n <md-outlined-button ?disabled=${!editable} @click=${() => navigate(`board-modeller/${this.boardId}`)}>\n <md-icon slot=\"icon\">design_services</md-icon>${i18next.t('button.open-modeller', {\n defaultValue: 'Open in modeller'\n })}\n </md-outlined-button>\n <md-filled-button cap ?disabled=${!editable || !this.isDirty} @click=${this.updateBoard.bind(this)}>\n <md-icon slot=\"icon\">save</md-icon>${i18next.t('button.save')}\n </md-filled-button>\n </div>\n </div>\n `\n }\n\n private renderWhat(board: any, boardGroupList: any[]) {\n if (!this.board) {\n return nothing\n }\n\n const released = board.state === 'released'\n const group = boardGroupList.find(item => item.id == this.original?.groupId)\n const updater = board.updater?.name || board.creator?.name || ''\n const ago = timeAgo(board.updatedAt || board.createdAt)\n\n return html`\n <div class=\"what\">\n <span pill ?released=${released}>\n ${released\n ? i18next.t('label.released', { defaultValue: 'released' })\n : i18next.t('label.draft', { defaultValue: 'draft' })}\n </span>\n <span>v${board.version ?? 0}</span>\n ${group ? html`<span dot><b>${group.name}</b></span>` : nothing}\n ${updater\n ? html`<span dot>${i18next.t('text.updated by', { defaultValue: 'updated by' })} <b>${updater}</b> ${ago}</span>`\n : ago\n ? html`<span dot>${i18next.t('text.updated', { defaultValue: 'updated' })} ${ago}</span>`\n : nothing}\n </div>\n `\n }\n\n private renderDuplicate(board: any) {\n const sameAsSource =\n this.original?.name == board.name && this._appCtrl.domain?.subdomain == this.targetSubdomain\n\n return html`\n <div duplicate>\n <div class=\"section\">${i18next.t('text.duplicate', { defaultValue: 'Duplicate' })}</div>\n <div class=\"note\">\n ${i18next.t('text.duplicate hint', {\n defaultValue: 'Copies this board into a domain and group. Give it a new name when copying within this domain.'\n })}\n </div>\n <div class=\"fields\">\n <div class=\"row\">\n <label>\n ${i18next.t('label.domain')}\n <select\n @change=${e => {\n this.targetSubdomain = e.target.value\n this.getGroupsByDomain(this.targetSubdomain)\n }}\n .value=${this.targetSubdomain || ''}\n >\n <option value=\"\"></option>\n ${this.targetDomains.map(\n domain =>\n html`<option value=${domain.subdomain} ?selected=${domain.subdomain == this.targetSubdomain}>\n ${domain.name}\n </option>`\n )}\n </select>\n </label>\n <label>\n ${i18next.t('label.group')}\n <select @change=${e => (this.targetGroupId = e.target.value)} .value=${this.targetGroupId || ''}>\n <option value=\"\"></option>\n ${this.targetGroups.map(\n group => html`<option value=${group.id} ?selected=${group.id == this.targetGroupId}>${group.name}</option>`\n )}\n </select>\n </label>\n </div>\n </div>\n <div tools>\n <div filler></div>\n <md-text-button cap @click=${() => (this.duplicating = false)}>${i18next.t('button.cancel')}</md-text-button>\n <md-filled-button\n cap\n ?disabled=${!this.original?.name || !board.name || !this.targetSubdomain || sameAsSource}\n @click=${this.cloneBoard.bind(this)}\n >\n <md-icon slot=\"icon\">content_copy</md-icon>${i18next.t('button.copy')}\n </md-filled-button>\n </div>\n </div>\n `\n }\n\n async firstUpdated() {\n this.targetSubdomain = this.targetSubdomain ?? this._appCtrl.domain?.subdomain\n this.enableModeller = await hasPrivilege({ privilege: 'mutation', category: 'board' })\n\n this.refresh()\n }\n\n async refresh() {\n const response = (\n await client.query({\n query: gql`\n query FetchBoardById($id: String!) {\n board(id: $id) {\n id\n name\n description\n model\n group {\n id\n name\n }\n playGroups {\n id\n name\n }\n thumbnail\n createdAt\n creator {\n id\n name\n }\n type\n state\n version\n updatedAt\n updater {\n id\n name\n }\n }\n\n groups {\n items {\n id\n name\n description\n }\n }\n\n playGroups {\n items {\n id\n name\n description\n }\n total\n }\n\n domainsWithPrivilege(privilege: \"mutation\", category: \"board\") {\n name\n subdomain\n }\n }\n `,\n variables: { id: this.boardId }\n })\n ).data\n\n const board = response.board\n this.groupId = board.group?.id\n\n this.board = { ...board, groupId: this.groupId }\n this.original = { ...this.board }\n\n this.boardGroupList = response.groups.items\n this.playGroupList = response.playGroups.items\n\n this.targetDomains = response.domainsWithPrivilege\n this.targetGroups = response.groups.items\n this.targetGroupId = this.groupId\n }\n\n async getGroupsByDomain(subdomain?: string) {\n this.targetGroups = []\n this.targetGroupId = ''\n\n if (!subdomain) {\n return\n }\n\n const response2 = (\n await client.query({\n query: gql`\n query {\n groups {\n items {\n id\n name\n description\n }\n }\n }\n `,\n variables: { id: this.boardId },\n context: {\n headers: {\n 'x-things-factory-domain': subdomain\n }\n }\n })\n ).data\n\n this.targetGroups = response2.groups.items\n }\n\n /** Something in the form differs from what the server has. */\n get isDirty() {\n if (!this.board || !this.original) {\n return false\n }\n\n const { name, description, groupId, type } = this.board\n\n return (\n this.original.name != name ||\n (this.original.description || '') != (description || '') ||\n (this.original.groupId || '') != (groupId || '') ||\n this.original.type != type\n )\n }\n\n get isReleasable() {\n if (!this.board || this.board.state == 'released') {\n return false\n }\n\n return !this.isDirty\n }\n\n async cloneBoard() {\n if (!this.original.name || (this.board.name == this.original.name && this._appCtrl.domain?.subdomain == this.targetSubdomain)) {\n notify('error', i18next.t('error.name must be unique from the original board', { name: this.original.name }))\n return\n }\n\n const { id, name, description } = this.board\n\n this.dispatchEvent(\n new CustomEvent('clone-board', {\n detail: {\n id,\n name,\n description,\n targetSubdomain: this.targetSubdomain,\n targetGroupId: this.targetGroupId\n },\n bubbles: true,\n composed: true\n })\n )\n\n this.close()\n }\n\n async exportBoard() {\n const board = { ...this.board, model: JSON.parse(this.board.model) }\n\n const json = JSON.stringify(board, null, 2)\n const blob = new Blob([json], { type: 'application/json;charset=utf-8' })\n\n const blobUrl = URL.createObjectURL(blob)\n\n const link = document.createElement('a')\n link.href = blobUrl\n link.download = `${board.name}.json`\n\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n\n URL.revokeObjectURL(blobUrl)\n }\n\n async releaseBoard() {\n const { id } = this.board\n\n // 릴리즈 코멘트(선택) 입력 — OxPrompt.prompt(모달, native prompt 대체). 취소 시 릴리즈 중단.\n const comment = await OxPrompt.prompt({\n type: 'question',\n title: String(i18next.t('button.release')),\n text: String(i18next.t('text.release comment optional')),\n multiline: true,\n confirmButton: { text: String(i18next.t('button.release')) },\n cancelButton: { text: String(i18next.t('button.cancel')) }\n })\n if (comment === null) return\n\n this.dispatchEvent(\n new CustomEvent('release-board', {\n detail: {\n id,\n comment: comment.trim() || null\n },\n bubbles: true,\n composed: true\n })\n )\n }\n\n async updateBoard() {\n const { id, name, description, groupId, type } = this.board\n /* model 정보를 제외하고 업데이트 */\n\n this.dispatchEvent(\n new CustomEvent('update-board', {\n detail: { id, name, description, groupId, type },\n bubbles: true,\n composed: true\n })\n )\n\n /* The form is what the server now has; Save goes quiet until the next edit. */\n this.original = { ...this.board }\n this.requestUpdate()\n }\n\n async deleteBoard() {\n if (\n await OxPrompt.open({\n title: i18next.t('text.are_you_sure'),\n text: i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }),\n confirmButton: { text: i18next.t('button.confirm') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n ) {\n this.dispatchEvent(\n new CustomEvent('delete-board', {\n detail: this.board,\n bubbles: true,\n composed: true\n })\n )\n\n this.close()\n }\n }\n\n async joinPlayGroup(group) {\n this.dispatchEvent(\n new CustomEvent('join-playgroup', {\n detail: {\n board: this.board,\n playGroup: group\n },\n bubbles: true,\n composed: true\n })\n )\n }\n\n async leavePlayGroup(group) {\n this.dispatchEvent(\n new CustomEvent('leave-playgroup', {\n detail: {\n board: this.board,\n playGroup: group\n },\n bubbles: true,\n composed: true\n })\n )\n }\n\n close() {\n history.back()\n }\n}\n"]}
|
|
@@ -49,23 +49,6 @@ let BoardInfoLink = class BoardInfoLink extends LitElement {
|
|
|
49
49
|
border-top: 1px solid var(--md-sys-color-outline-variant);
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
[footer] .buttons {
|
|
53
|
-
border-top: 0;
|
|
54
|
-
padding-top: 0;
|
|
55
|
-
margin-top: 0;
|
|
56
|
-
align-items: center;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
@media (pointer: coarse) {
|
|
60
|
-
[footer] {
|
|
61
|
-
padding: 0;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
[footer] .buttons {
|
|
65
|
-
margin: 0;
|
|
66
|
-
border-top: 0;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
52
|
`
|
|
70
53
|
]; }
|
|
71
54
|
render() {
|
|
@@ -80,7 +63,7 @@ let BoardInfoLink = class BoardInfoLink extends LitElement {
|
|
|
80
63
|
</div>
|
|
81
64
|
|
|
82
65
|
<div footer>
|
|
83
|
-
<div
|
|
66
|
+
<div tools>
|
|
84
67
|
<md-outlined-button @click=${this.copyLink.bind(this)}>
|
|
85
68
|
<md-icon slot="icon">${this.copied ? 'check' : 'link'}</md-icon>
|
|
86
69
|
${this.copied
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-info-link.js","sourceRoot":"","sources":["../../client/viewparts/board-info-link.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,4BAA4B,CAAA;AACnC,OAAO,yCAAyC,CAAA;AAEhD,OAAO,mBAAmB,CAAA;AAGnB,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,UAAU;IAAtC;;
|
|
1
|
+
{"version":3,"file":"board-info-link.js","sourceRoot":"","sources":["../../client/viewparts/board-info-link.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,4BAA4B,CAAA;AACnC,OAAO,yCAAyC,CAAA;AAEhD,OAAO,mBAAmB,CAAA;AAGnB,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,UAAU;IAAtC;;QA6CY,WAAM,GAAG,KAAK,CAAA;IA+BjC,CAAC;aA3EQ,WAAM,GAAG;QACd,iBAAiB;QACjB,cAAc;QACd,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkCF;KACF,AAtCY,CAsCZ;IAQD,MAAM;QACJ,OAAO,IAAI,CAAA;;;;sBAIO,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE;wBAClB,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE;;;;;;;uCAOP,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;mCAC5B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;cACnD,IAAI,CAAC,MAAM;YACX,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;YAChE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,YAAY,EAAE,oBAAoB,EAAE,CAAC;;;;KAIhF,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,MAAM,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAA;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;IAC/C,CAAC;;AAlC2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;4CAA0D;AAEtD;IAA9B,KAAK,CAAC,cAAc,CAAC;;kDAA0B;AAE/B;IAAhB,KAAK,EAAE;;6CAAuB;AA7CpB,aAAa;IADzB,aAAa,CAAC,iBAAiB,CAAC;GACpB,aAAa,CA4EzB","sourcesContent":["import { css, html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { i18next } from '@operato/i18n'\nimport { CommonPopupStyles } from '@operato/styles'\nimport { InfoFormStyles } from './info-dialog-styles.js'\nimport '@material/web/icon/icon.js'\nimport '@material/web/button/outlined-button.js'\n\nimport './link-builder.js'\n\n@customElement('board-info-link')\nexport class BoardInfoLink extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n padding: 0;\n gap: 0;\n box-sizing: border-box;\n color: var(--md-sys-color-on-surface);\n background: var(--info-dialog-surface, var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface)));\n }\n\n [body] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-large, 16px);\n padding: var(--spacing-large, 16px);\n }\n\n link-builder {\n padding: 0;\n }\n\n /* Same fixed footer as the basic tab: the two commits of this tab, always in reach. */\n [footer] {\n flex: none;\n padding: var(--spacing-medium, 8px) var(--popup-padding);\n border-top: 1px solid var(--md-sys-color-outline-variant);\n }\n\n `\n ]\n\n @property({ type: Object }) board?: { id: string; name: string; description: string }\n\n @query('link-builder') private linkBuilder!: any\n\n @state() private copied = false\n\n render() {\n return html`\n <div body>\n <link-builder\n command=\"headless-full\"\n target-id=${this.board?.id || ''}\n target-name=${this.board?.name || ''}\n ></link-builder>\n\n </div>\n\n <div footer>\n <div tools>\n <md-outlined-button @click=${this.copyLink.bind(this)}>\n <md-icon slot=\"icon\">${this.copied ? 'check' : 'link'}</md-icon>\n ${this.copied\n ? i18next.t('text.link copied', { defaultValue: 'Link copied' })\n : i18next.t('button.copy-link', { defaultValue: 'Copy headless link' })}\n </md-outlined-button>\n </div>\n </div>\n `\n }\n\n private async copyLink() {\n await this.linkBuilder?.copyLink()\n this.copied = true\n setTimeout(() => (this.copied = false), 2000)\n }\n}\n"]}
|
|
@@ -46,23 +46,6 @@ let BoardInfoTemplate = class BoardInfoTemplate extends LitElement {
|
|
|
46
46
|
border-top: 1px solid var(--md-sys-color-outline-variant);
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
[footer] .buttons {
|
|
50
|
-
border-top: 0;
|
|
51
|
-
padding-top: 0;
|
|
52
|
-
margin-top: 0;
|
|
53
|
-
align-items: center;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
@media (pointer: coarse) {
|
|
57
|
-
[footer] {
|
|
58
|
-
padding: 0;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
[footer] .buttons {
|
|
62
|
-
margin: 0;
|
|
63
|
-
border-top: 0;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
49
|
`
|
|
67
50
|
]; }
|
|
68
51
|
render() {
|
|
@@ -72,7 +55,7 @@ let BoardInfoTemplate = class BoardInfoTemplate extends LitElement {
|
|
|
72
55
|
</div>
|
|
73
56
|
|
|
74
57
|
<div footer>
|
|
75
|
-
<div
|
|
58
|
+
<div tools>
|
|
76
59
|
<div filler></div>
|
|
77
60
|
<md-filled-button cap @click=${() => this.templateBuilder?.registerBoardAsTemplate()}>
|
|
78
61
|
<md-icon slot="icon">bookmark_add</md-icon>${i18next.t('text.register-template')}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-info-template.js","sourceRoot":"","sources":["../../client/viewparts/board-info-template.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,4BAA4B,CAAA;AACnC,OAAO,uCAAuC,CAAA;AAC9C,OAAO,yCAAyC,CAAA;AAEhD,OAAO,6BAA6B,CAAA;AAG7B,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,UAAU;aACxC,WAAM,GAAG;QACd,iBAAiB;QACjB,cAAc;QACd,GAAG,CAAA
|
|
1
|
+
{"version":3,"file":"board-info-template.js","sourceRoot":"","sources":["../../client/viewparts/board-info-template.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,4BAA4B,CAAA;AACnC,OAAO,uCAAuC,CAAA;AAC9C,OAAO,yCAAyC,CAAA;AAEhD,OAAO,6BAA6B,CAAA;AAG7B,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,UAAU;aACxC,WAAM,GAAG;QACd,iBAAiB;QACjB,cAAc;QACd,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkCF;KACF,AAtCY,CAsCZ;IAMD,MAAM;QACJ,OAAO,IAAI,CAAA;;yCAE0B,IAAI,CAAC,KAAK;;;;;;yCAMV,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,uBAAuB,EAAE;yDACrC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;;;;KAIvF,CAAA;IACH,CAAC;;AAnB2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;gDAA0D;AAE5C;IAAxC,KAAK,CAAC,wBAAwB,CAAC;;0DAA8B;AA3CnD,iBAAiB;IAD7B,aAAa,CAAC,qBAAqB,CAAC;GACxB,iBAAiB,CA6D7B","sourcesContent":["import { css, html, LitElement } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { i18next } from '@operato/i18n'\nimport { CommonPopupStyles } from '@operato/styles'\nimport { InfoFormStyles } from './info-dialog-styles.js'\nimport '@material/web/icon/icon.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/outlined-button.js'\n\nimport './board-template-builder.js'\n\n@customElement('board-info-template')\nexport class BoardInfoTemplate extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n padding: 0;\n gap: 0;\n box-sizing: border-box;\n color: var(--md-sys-color-on-surface);\n background: var(--info-dialog-surface, var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface)));\n }\n\n [body] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-large, 16px);\n padding: var(--spacing-large, 16px);\n }\n\n board-template-builder {\n padding: 0;\n }\n\n /* Same fixed footer as the basic tab: the two commits of this tab, always in reach. */\n [footer] {\n flex: none;\n padding: var(--spacing-medium, 8px) var(--popup-padding);\n border-top: 1px solid var(--md-sys-color-outline-variant);\n }\n\n `\n ]\n\n @property({ type: Object }) board?: { id: string; name: string; description: string }\n\n @query('board-template-builder') private templateBuilder!: any\n\n render() {\n return html`\n <div body>\n <board-template-builder .board=${this.board}></board-template-builder>\n </div>\n\n <div footer>\n <div tools>\n <div filler></div>\n <md-filled-button cap @click=${() => this.templateBuilder?.registerBoardAsTemplate()}>\n <md-icon slot=\"icon\">bookmark_add</md-icon>${i18next.t('text.register-template')}\n </md-filled-button>\n </div>\n </div>\n `\n }\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import '@operato/popup/ox-popup-actions.js';
|
|
2
3
|
import { html, css, LitElement } from 'lit';
|
|
3
4
|
import { customElement, property, query, state } from 'lit/decorators.js';
|
|
4
5
|
import gql from 'graphql-tag';
|
|
@@ -21,10 +22,6 @@ let BoardTemplateInfo = class BoardTemplateInfo extends LitElement {
|
|
|
21
22
|
min-height: 72px;
|
|
22
23
|
resize: vertical;
|
|
23
24
|
}
|
|
24
|
-
|
|
25
|
-
.buttons [filler] {
|
|
26
|
-
flex: 1;
|
|
27
|
-
}
|
|
28
25
|
`
|
|
29
26
|
]; }
|
|
30
27
|
constructor() {
|
|
@@ -102,22 +99,20 @@ let BoardTemplateInfo = class BoardTemplateInfo extends LitElement {
|
|
|
102
99
|
})}</span>`}
|
|
103
100
|
</div>
|
|
104
101
|
|
|
105
|
-
<
|
|
102
|
+
<ox-popup-actions>
|
|
106
103
|
${mine
|
|
107
104
|
? html `
|
|
108
|
-
<md-text-button cap
|
|
105
|
+
<md-text-button slot="start" destructive cap @click=${this.onDelete}>
|
|
109
106
|
<md-icon slot="icon">delete_outline</md-icon>${i18next.t('button.delete')}
|
|
110
107
|
</md-text-button>
|
|
111
|
-
<
|
|
112
|
-
<md-filled-button cap @click=${this.onUpdate}>
|
|
108
|
+
<md-filled-button slot="confirm" cap @click=${this.onUpdate}>
|
|
113
109
|
<md-icon slot="icon">save</md-icon>${i18next.t('button.save')}
|
|
114
110
|
</md-filled-button>
|
|
115
111
|
`
|
|
116
112
|
: html `
|
|
117
|
-
<
|
|
118
|
-
<md-text-button cap @click=${() => history.back()}>${i18next.t('button.close', { defaultValue: 'close' })}</md-text-button>
|
|
113
|
+
<md-text-button slot="cancel" cap @click=${() => history.back()}>${i18next.t('button.close', { defaultValue: 'close' })}</md-text-button>
|
|
119
114
|
`}
|
|
120
|
-
</
|
|
115
|
+
</ox-popup-actions>
|
|
121
116
|
`;
|
|
122
117
|
}
|
|
123
118
|
async onUpdate() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-template-info.js","sourceRoot":"","sources":["../../client/viewparts/board-template-info.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, css, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport gql from 'graphql-tag'\nimport { store } from '@operato/shell'\nimport { client } from '@operato/graphql'\nimport { i18next } from '@operato/i18n'\nimport { OxPrompt } from '@operato/popup'\nimport { CommonPopupStyles } from '@operato/styles'\nimport { InfoFormStyles } from './info-dialog-styles.js'\nimport '@material/web/icon/icon.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\nimport { notify } from '../utils/notify-helper.js'\n\n@customElement('board-template-info')\nexport class BoardTemplateInfo extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n textarea {\n min-height: 72px;\n resize: vertical;\n }\n\n .buttons [filler] {\n flex: 1;\n }\n `\n ]\n\n constructor() {\n super()\n this.template = {\n name: '',\n description: '',\n visibility: 'private'\n }\n }\n\n @property({ type: Object }) template: any\n @state() username: string = ''\n\n @query('form') form!: HTMLFormElement\n\n private _unsubscribe?: () => void\n\n\n connectedCallback() {\n\n super.connectedCallback()\n\n this._applyState()\n\n this._unsubscribe = store.subscribe(() => this._applyState())\n\n }\n\n\n disconnectedCallback() {\n\n super.disconnectedCallback()\n\n this._unsubscribe?.()\n\n }\n\n\n private _applyState() {\n\n const __state__ = store.getState() as any\nthis.username = __state__.auth?.user?.username || ''\n\n }\n\n get isMine() {\n return this.template?.creator?.username === this.username\n }\n\n render() {\n const template = this.template || {}\n const mine = this.isMine\n const when = (value?: string) => (value ? new Date(value).toLocaleString() : '')\n\n return html`\n <form>\n <div class=\"fields\">\n <label>\n ${i18next.t('field.name')}\n <input\n name=\"name\"\n .value=${template.name || ''}\n @input=${e => (this.template.name = e.target.value)}\n ?disabled=${!mine}\n />\n </label>\n <label>\n ${i18next.t('field.description')}\n <textarea\n name=\"description\"\n .value=${template.description || ''}\n @input=${e => (this.template.description = e.target.value)}\n ?disabled=${!mine}\n ></textarea>\n </label>\n <label>\n ${i18next.t('field.visibility')}\n <select\n name=\"visibility\"\n .value=${template.visibility || 'private'}\n @change=${e => (this.template.visibility = e.target.value)}\n ?disabled=${!mine}\n >\n <option value=\"private\">${i18next.t('label.visibility-private')}</option>\n <option value=\"domain\">${i18next.t('label.visibility-domain')}</option>\n <option value=\"public\">${i18next.t('label.visibility-public')}</option>\n </select>\n </label>\n </div>\n </form>\n\n <div class=\"provenance\">\n <span>${i18next.t('label.creator')} <b>${template.creator?.name || '-'}</b> ${when(template.createdAt)}</span>\n ${mine\n ? ''\n : html`<span>${i18next.t('text.only the creator can edit a template', {\n defaultValue: 'Only the creator can change a template.'\n })}</span>`}\n </div>\n\n <div class=\"buttons\">\n ${mine\n ? html`\n <md-text-button cap danger @click=${this.onDelete}>\n <md-icon slot=\"icon\">delete_outline</md-icon>${i18next.t('button.delete')}\n </md-text-button>\n <div filler></div>\n <md-filled-button cap @click=${this.onUpdate}>\n <md-icon slot=\"icon\">save</md-icon>${i18next.t('button.save')}\n </md-filled-button>\n `\n : html`\n <div filler></div>\n <md-text-button cap @click=${() => history.back()}>${i18next.t('button.close', { defaultValue: 'close' })}</md-text-button>\n `}\n </div>\n `\n }\n\n async onUpdate() {\n const formData = new FormData(this.form)\n const patch: any = {}\n for (const [key, value] of formData.entries()) {\n patch[key] = value\n }\n\n try {\n await client.mutate({\n mutation: gql`\n mutation ($id: String!, $patch: BoardTemplatePatch!) {\n updateBoardTemplate(id: $id, patch: $patch) {\n id\n }\n }\n `,\n variables: {\n id: this.template.id,\n patch\n }\n })\n notify('info', i18next.t('text.board-template updated'))\n this.dispatchEvent(new CustomEvent('updated', { bubbles: true, composed: true }))\n history.back()\n } catch (ex) {\n notify('error', ex, ex)\n }\n }\n\n async onDelete() {\n if (\n await OxPrompt.open({\n title: i18next.t('text.are_you_sure'),\n text: i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }),\n confirmButton: { text: i18next.t('button.confirm') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n ) {\n try {\n await client.mutate({\n mutation: gql`\n mutation ($id: String!) {\n deleteBoardTemplate(id: $id)\n }\n `,\n variables: { id: this.template.id }\n })\n notify('info', i18next.t('text.board-template deleted'))\n this.dispatchEvent(new CustomEvent('deleted', { bubbles: true, composed: true }))\n history.back()\n } catch (ex) {\n notify('error', ex, ex)\n }\n }\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"board-template-info.js","sourceRoot":"","sources":["../../client/viewparts/board-template-info.ts"],"names":[],"mappings":";AAAA,OAAO,oCAAoC,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,4BAA4B,CAAA;AACnC,OAAO,uCAAuC,CAAA;AAC9C,OAAO,qCAAqC,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAG3C,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,UAAU;aACxC,WAAM,GAAG;QACd,iBAAiB;QACjB,cAAc;QACd,GAAG,CAAA;;;;;KAKF;KACF,AATY,CASZ;IAED;QACE,KAAK,EAAE,CAAA;QASA,aAAQ,GAAW,EAAE,CAAA;QAR5B,IAAI,CAAC,QAAQ,GAAG;YACd,IAAI,EAAE,EAAE;YACR,WAAW,EAAE,EAAE;YACf,UAAU,EAAE,SAAS;SACtB,CAAA;IACH,CAAC;IAUD,iBAAiB;QAEf,KAAK,CAAC,iBAAiB,EAAE,CAAA;QAEzB,IAAI,CAAC,WAAW,EAAE,CAAA;QAElB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;IAE/D,CAAC;IAGD,oBAAoB;QAElB,KAAK,CAAC,oBAAoB,EAAE,CAAA;QAE5B,IAAI,CAAC,YAAY,EAAE,EAAE,CAAA;IAEvB,CAAC;IAGO,WAAW;QAEjB,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAS,CAAA;QAC7C,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAA;IAElD,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAA;IAC3D,CAAC;IAED,MAAM;QACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAA;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAA;QACxB,MAAM,IAAI,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAEhF,OAAO,IAAI,CAAA;;;;cAID,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;;;uBAGd,QAAQ,CAAC,IAAI,IAAI,EAAE;uBACnB,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;0BACvC,CAAC,IAAI;;;;cAIjB,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;;;uBAGrB,QAAQ,CAAC,WAAW,IAAI,EAAE;uBAC1B,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;0BAC9C,CAAC,IAAI;;;;cAIjB,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;;;uBAGpB,QAAQ,CAAC,UAAU,IAAI,SAAS;wBAC/B,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;0BAC9C,CAAC,IAAI;;wCAES,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;uCACtC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC;uCACpC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC;;;;;;;gBAO3D,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,QAAQ,CAAC,OAAO,EAAE,IAAI,IAAI,GAAG,QAAQ,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;UACpG,IAAI;YACJ,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,IAAI,CAAA,SAAS,OAAO,CAAC,CAAC,CAAC,2CAA2C,EAAE;gBAClE,YAAY,EAAE,yCAAyC;aACxD,CAAC,SAAS;;;;UAIb,IAAI;YACJ,CAAC,CAAC,IAAI,CAAA;oEACoD,IAAI,CAAC,QAAQ;+DAClB,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;;4DAE7B,IAAI,CAAC,QAAQ;qDACpB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;;aAEhE;YACH,CAAC,CAAC,IAAI,CAAA;yDACyC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;aACxH;;KAER,CAAA;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxC,MAAM,KAAK,GAAQ,EAAE,CAAA;QACrB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACpB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,MAAM,CAAC;gBAClB,QAAQ,EAAE,GAAG,CAAA;;;;;;SAMZ;gBACD,SAAS,EAAE;oBACT,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE;oBACpB,KAAK;iBACN;aACF,CAAC,CAAA;YACF,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAA;YACxD,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YACjF,OAAO,CAAC,IAAI,EAAE,CAAA;QAChB,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IACE,MAAM,QAAQ,CAAC,IAAI,CAAC;YAClB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;YACrC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC;YAClE,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE;YACpD,YAAY,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE;SACnD,CAAC,EACF,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,MAAM,CAAC;oBAClB,QAAQ,EAAE,GAAG,CAAA;;;;WAIZ;oBACD,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;iBACpC,CAAC,CAAA;gBACF,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAA;gBACxD,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;gBACjF,OAAO,CAAC,IAAI,EAAE,CAAA;YAChB,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;YACzB,CAAC;QACH,CAAC;IACH,CAAC;;AAjK2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;mDAAc;AAChC;IAAR,KAAK,EAAE;;mDAAsB;AAEf;IAAd,KAAK,CAAC,MAAM,CAAC;8BAAQ,eAAe;+CAAA;AAxB1B,iBAAiB;IAD7B,aAAa,CAAC,qBAAqB,CAAC;;GACxB,iBAAiB,CAwL7B","sourcesContent":["import '@operato/popup/ox-popup-actions.js'\nimport { html, css, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport gql from 'graphql-tag'\nimport { store } from '@operato/shell'\nimport { client } from '@operato/graphql'\nimport { i18next } from '@operato/i18n'\nimport { OxPrompt } from '@operato/popup'\nimport { CommonPopupStyles } from '@operato/styles'\nimport { InfoFormStyles } from './info-dialog-styles.js'\nimport '@material/web/icon/icon.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\nimport { notify } from '../utils/notify-helper.js'\n\n@customElement('board-template-info')\nexport class BoardTemplateInfo extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n textarea {\n min-height: 72px;\n resize: vertical;\n }\n `\n ]\n\n constructor() {\n super()\n this.template = {\n name: '',\n description: '',\n visibility: 'private'\n }\n }\n\n @property({ type: Object }) template: any\n @state() username: string = ''\n\n @query('form') form!: HTMLFormElement\n\n private _unsubscribe?: () => void\n\n\n connectedCallback() {\n\n super.connectedCallback()\n\n this._applyState()\n\n this._unsubscribe = store.subscribe(() => this._applyState())\n\n }\n\n\n disconnectedCallback() {\n\n super.disconnectedCallback()\n\n this._unsubscribe?.()\n\n }\n\n\n private _applyState() {\n\n const __state__ = store.getState() as any\nthis.username = __state__.auth?.user?.username || ''\n\n }\n\n get isMine() {\n return this.template?.creator?.username === this.username\n }\n\n render() {\n const template = this.template || {}\n const mine = this.isMine\n const when = (value?: string) => (value ? new Date(value).toLocaleString() : '')\n\n return html`\n <form>\n <div class=\"fields\">\n <label>\n ${i18next.t('field.name')}\n <input\n name=\"name\"\n .value=${template.name || ''}\n @input=${e => (this.template.name = e.target.value)}\n ?disabled=${!mine}\n />\n </label>\n <label>\n ${i18next.t('field.description')}\n <textarea\n name=\"description\"\n .value=${template.description || ''}\n @input=${e => (this.template.description = e.target.value)}\n ?disabled=${!mine}\n ></textarea>\n </label>\n <label>\n ${i18next.t('field.visibility')}\n <select\n name=\"visibility\"\n .value=${template.visibility || 'private'}\n @change=${e => (this.template.visibility = e.target.value)}\n ?disabled=${!mine}\n >\n <option value=\"private\">${i18next.t('label.visibility-private')}</option>\n <option value=\"domain\">${i18next.t('label.visibility-domain')}</option>\n <option value=\"public\">${i18next.t('label.visibility-public')}</option>\n </select>\n </label>\n </div>\n </form>\n\n <div class=\"provenance\">\n <span>${i18next.t('label.creator')} <b>${template.creator?.name || '-'}</b> ${when(template.createdAt)}</span>\n ${mine\n ? ''\n : html`<span>${i18next.t('text.only the creator can edit a template', {\n defaultValue: 'Only the creator can change a template.'\n })}</span>`}\n </div>\n\n <ox-popup-actions>\n ${mine\n ? html`\n <md-text-button slot=\"start\" destructive cap @click=${this.onDelete}>\n <md-icon slot=\"icon\">delete_outline</md-icon>${i18next.t('button.delete')}\n </md-text-button>\n <md-filled-button slot=\"confirm\" cap @click=${this.onUpdate}>\n <md-icon slot=\"icon\">save</md-icon>${i18next.t('button.save')}\n </md-filled-button>\n `\n : html`\n <md-text-button slot=\"cancel\" cap @click=${() => history.back()}>${i18next.t('button.close', { defaultValue: 'close' })}</md-text-button>\n `}\n </ox-popup-actions>\n `\n }\n\n async onUpdate() {\n const formData = new FormData(this.form)\n const patch: any = {}\n for (const [key, value] of formData.entries()) {\n patch[key] = value\n }\n\n try {\n await client.mutate({\n mutation: gql`\n mutation ($id: String!, $patch: BoardTemplatePatch!) {\n updateBoardTemplate(id: $id, patch: $patch) {\n id\n }\n }\n `,\n variables: {\n id: this.template.id,\n patch\n }\n })\n notify('info', i18next.t('text.board-template updated'))\n this.dispatchEvent(new CustomEvent('updated', { bubbles: true, composed: true }))\n history.back()\n } catch (ex) {\n notify('error', ex, ex)\n }\n }\n\n async onDelete() {\n if (\n await OxPrompt.open({\n title: i18next.t('text.are_you_sure'),\n text: i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }),\n confirmButton: { text: i18next.t('button.confirm') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n ) {\n try {\n await client.mutate({\n mutation: gql`\n mutation ($id: String!) {\n deleteBoardTemplate(id: $id)\n }\n `,\n variables: { id: this.template.id }\n })\n notify('info', i18next.t('text.board-template deleted'))\n this.dispatchEvent(new CustomEvent('deleted', { bubbles: true, composed: true }))\n history.back()\n } catch (ex) {\n notify('error', ex, ex)\n }\n }\n }\n\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import '@operato/popup/ox-popup-actions.js';
|
|
2
3
|
import '@material/web/icon/icon.js';
|
|
3
4
|
import '@material/web/button/filled-button.js';
|
|
4
5
|
import '@material/web/button/text-button.js';
|
|
@@ -40,24 +41,22 @@ let GroupInfo = class GroupInfo extends LitElement {
|
|
|
40
41
|
|
|
41
42
|
${this.groupId ? this.renderProvenance(group) : ''}
|
|
42
43
|
|
|
43
|
-
<
|
|
44
|
+
<ox-popup-actions>
|
|
44
45
|
${this.groupId
|
|
45
46
|
? html `
|
|
46
|
-
<md-text-button cap
|
|
47
|
+
<md-text-button slot="start" destructive cap @click=${this.deleteGroup.bind(this)}>
|
|
47
48
|
<md-icon slot="icon">delete_outline</md-icon>${i18next.t('button.delete')}
|
|
48
49
|
</md-text-button>
|
|
49
|
-
<
|
|
50
|
-
<md-filled-button cap @click=${this.updateGroup.bind(this)}>
|
|
50
|
+
<md-filled-button slot="confirm" cap @click=${this.updateGroup.bind(this)}>
|
|
51
51
|
<md-icon slot="icon">save</md-icon>${i18next.t('button.save')}
|
|
52
52
|
</md-filled-button>
|
|
53
53
|
`
|
|
54
54
|
: html `
|
|
55
|
-
<
|
|
56
|
-
<md-filled-button cap @click=${this.createGroup.bind(this)}>
|
|
55
|
+
<md-filled-button slot="confirm" cap @click=${this.createGroup.bind(this)}>
|
|
57
56
|
<md-icon slot="icon">create_new_folder</md-icon>${i18next.t('button.create')}
|
|
58
57
|
</md-filled-button>
|
|
59
58
|
`}
|
|
60
|
-
</
|
|
59
|
+
</ox-popup-actions>
|
|
61
60
|
`;
|
|
62
61
|
}
|
|
63
62
|
renderProvenance(group) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-info-basic.js","sourceRoot":"","sources":["../../client/viewparts/group-info-basic.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,uCAAuC,CAAA;AAC9C,OAAO,qCAAqC,CAAA;AAE5C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD;;;;GAIG;AAEI,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,UAAU;IAAlC;;QAKI,UAAK,GAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"group-info-basic.js","sourceRoot":"","sources":["../../client/viewparts/group-info-basic.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/popup/ox-popup-actions.js'\nimport '@material/web/icon/icon.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\n\nimport { html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next } from '@operato/i18n'\nimport { CommonPopupStyles } from '@operato/styles'\n\nimport { fetchGroup } from '../graphql/group.js'\nimport { InfoFormStyles } from './info-dialog-styles.js'\n\n/**\n * The group form: a name, a description, and one commit button. Who made it and when is a\n * side note that only exists for a group that exists - a new group used to show two rows of\n * \"Invalid Date\" here.\n */\n@customElement('group-info-basic')\nexport class GroupInfo extends LitElement {\n static styles = [CommonPopupStyles, InfoFormStyles]\n\n @property({ type: String }) groupId?: string\n\n @state() group: any = { name: '', description: '' }\n\n render() {\n const group = this.group || { name: '', description: '' }\n\n return html`\n <div class=\"fields\">\n <label>\n ${i18next.t('label.name')}\n <input type=\"text\" .value=${group.name || ''} @change=${e => (this.group.name = e.target.value)} autofocus />\n </label>\n\n <label>\n ${i18next.t('label.description')}\n <input\n type=\"text\"\n .value=${group.description || ''}\n @change=${e => (this.group.description = e.target.value)}\n />\n </label>\n </div>\n\n ${this.groupId ? this.renderProvenance(group) : ''}\n\n <ox-popup-actions>\n ${this.groupId\n ? html`\n <md-text-button slot=\"start\" destructive cap @click=${this.deleteGroup.bind(this)}>\n <md-icon slot=\"icon\">delete_outline</md-icon>${i18next.t('button.delete')}\n </md-text-button>\n <md-filled-button slot=\"confirm\" cap @click=${this.updateGroup.bind(this)}>\n <md-icon slot=\"icon\">save</md-icon>${i18next.t('button.save')}\n </md-filled-button>\n `\n : html`\n <md-filled-button slot=\"confirm\" cap @click=${this.createGroup.bind(this)}>\n <md-icon slot=\"icon\">create_new_folder</md-icon>${i18next.t('button.create')}\n </md-filled-button>\n `}\n </ox-popup-actions>\n `\n }\n\n private renderProvenance(group: any) {\n const when = (value?: string) => (value ? new Date(value).toLocaleString() : '')\n\n return html`\n <div class=\"provenance\">\n <span>${i18next.t('label.creator')} <b>${group.creator?.name || '-'}</b> ${when(group.createdAt)}</span>\n <span>${i18next.t('label.updater')} <b>${group.updater?.name || '-'}</b> ${when(group.updatedAt)}</span>\n </div>\n `\n }\n\n updated(changes) {\n if (changes.has('groupId')) {\n this.refresh()\n }\n }\n\n firstUpdated() {\n setTimeout(() => {\n ;(this.renderRoot.querySelector('input') as any)?.focus()\n }, 100)\n }\n\n async refresh() {\n if (!this.groupId) {\n this.group = { name: '', description: '' }\n } else {\n const response = await fetchGroup(this.groupId)\n this.group = response.group\n }\n }\n\n async createGroup() {\n this.dispatchEvent(new CustomEvent('create-group', { detail: this.group, bubbles: true, composed: true }))\n this.close()\n }\n\n async updateGroup() {\n this.dispatchEvent(new CustomEvent('update-group', { detail: this.group, bubbles: true, composed: true }))\n this.close()\n }\n\n async deleteGroup() {\n this.dispatchEvent(new CustomEvent('delete-group', { detail: this.group, bubbles: true, composed: true }))\n this.close()\n }\n\n close() {\n history.back()\n }\n}\n"]}
|
|
@@ -36,7 +36,7 @@ let GroupInfoImport = class GroupInfoImport extends LitElement {
|
|
|
36
36
|
return html `
|
|
37
37
|
<ox-input-file accept="*/*" multiple="true"></ox-input-file>
|
|
38
38
|
|
|
39
|
-
<div
|
|
39
|
+
<div tools>
|
|
40
40
|
<label overwrite>
|
|
41
41
|
<md-checkbox touch-target="wrapper" checked></md-checkbox>
|
|
42
42
|
${i18next.t('label.overwrite', { defaultValue: 'overwrite' })}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-info-import.js","sourceRoot":"","sources":["../../client/viewparts/group-info-import.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,uCAAuC,CAAA;AAC9C,OAAO,oCAAoC,CAAA;AAC3C,OAAO,iCAAiC,CAAA;AAExC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD,4FAA4F;AAErF,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,UAAU;aACtC,WAAM,GAAG;QACd,iBAAiB;QACjB,cAAc;QACd,GAAG,CAAA;;;;;;;;;;;;;KAaF;KACF,AAjBY,CAiBZ;IASD,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,IAAI,CAAA,EAAE,CAAA;QACf,CAAC;QAED,OAAO,IAAI,CAAA;;;;;;YAMH,OAAO,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;;;uCAGhC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;kDAChB,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;KAG7E,CAAA;IACH,CAAC;IAED,OAAO,CAAC,OAAO;QACb,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,EAAE,CAAA;QAChB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAA;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC/C,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,eAAe,EAAE;YAC/B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK;gBAC9B,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO;aAClC;SACF,CAAC,CACH,CAAA;QAED,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,KAAK;QACH,OAAO,CAAC,IAAI,EAAE,CAAA;IAChB,CAAC;;AA7D2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;gDAAiB;AAEnC;IAAR,KAAK,EAAE;;8CAAW;AAEK;IAAvB,KAAK,CAAC,eAAe,CAAC;;qDAAkB;AACnB;IAArB,KAAK,CAAC,aAAa,CAAC;;kDAAe;AAzBzB,eAAe;IAD3B,aAAa,CAAC,mBAAmB,CAAC;GACtB,eAAe,CAkF3B","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/checkbox/checkbox.js'\nimport '@operato/input/ox-input-file.js'\n\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { i18next } from '@operato/i18n'\nimport { CommonPopupStyles } from '@operato/styles'\n\nimport { fetchGroup } from '../graphql/index.js'\nimport { InfoFormStyles } from './info-dialog-styles.js'\n\n/** Import exported boards into this group: a drop zone, an overwrite switch, one button. */\n@customElement('group-info-import')\nexport class GroupInfoImport extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n ox-input-file {\n min-height: 120px;\n }\n\n label[overwrite] {\n display: flex;\n align-items: center;\n gap: var(--spacing-small, 4px);\n font-size: var(--popup-font-size-small);\n color: var(--md-sys-color-on-surface-variant);\n cursor: pointer;\n }\n `\n ]\n\n @property({ type: String }) groupId?: string\n\n @state() group: any\n\n @query('ox-input-file') fileUploader: any\n @query('md-checkbox') overwrite: any\n\n render() {\n if (!this.groupId) {\n return html``\n }\n\n return html`\n <ox-input-file accept=\"*/*\" multiple=\"true\"></ox-input-file>\n\n <div
|
|
1
|
+
{"version":3,"file":"group-info-import.js","sourceRoot":"","sources":["../../client/viewparts/group-info-import.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,uCAAuC,CAAA;AAC9C,OAAO,oCAAoC,CAAA;AAC3C,OAAO,iCAAiC,CAAA;AAExC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD,4FAA4F;AAErF,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,UAAU;aACtC,WAAM,GAAG;QACd,iBAAiB;QACjB,cAAc;QACd,GAAG,CAAA;;;;;;;;;;;;;KAaF;KACF,AAjBY,CAiBZ;IASD,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,IAAI,CAAA,EAAE,CAAA;QACf,CAAC;QAED,OAAO,IAAI,CAAA;;;;;;YAMH,OAAO,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;;;uCAGhC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;kDAChB,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;KAG7E,CAAA;IACH,CAAC;IAED,OAAO,CAAC,OAAO;QACb,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,EAAE,CAAA;QAChB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAA;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC/C,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,eAAe,EAAE;YAC/B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK;gBAC9B,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO;aAClC;SACF,CAAC,CACH,CAAA;QAED,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,KAAK;QACH,OAAO,CAAC,IAAI,EAAE,CAAA;IAChB,CAAC;;AA7D2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;gDAAiB;AAEnC;IAAR,KAAK,EAAE;;8CAAW;AAEK;IAAvB,KAAK,CAAC,eAAe,CAAC;;qDAAkB;AACnB;IAArB,KAAK,CAAC,aAAa,CAAC;;kDAAe;AAzBzB,eAAe;IAD3B,aAAa,CAAC,mBAAmB,CAAC;GACtB,eAAe,CAkF3B","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/checkbox/checkbox.js'\nimport '@operato/input/ox-input-file.js'\n\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { i18next } from '@operato/i18n'\nimport { CommonPopupStyles } from '@operato/styles'\n\nimport { fetchGroup } from '../graphql/index.js'\nimport { InfoFormStyles } from './info-dialog-styles.js'\n\n/** Import exported boards into this group: a drop zone, an overwrite switch, one button. */\n@customElement('group-info-import')\nexport class GroupInfoImport extends LitElement {\n static styles = [\n CommonPopupStyles,\n InfoFormStyles,\n css`\n ox-input-file {\n min-height: 120px;\n }\n\n label[overwrite] {\n display: flex;\n align-items: center;\n gap: var(--spacing-small, 4px);\n font-size: var(--popup-font-size-small);\n color: var(--md-sys-color-on-surface-variant);\n cursor: pointer;\n }\n `\n ]\n\n @property({ type: String }) groupId?: string\n\n @state() group: any\n\n @query('ox-input-file') fileUploader: any\n @query('md-checkbox') overwrite: any\n\n render() {\n if (!this.groupId) {\n return html``\n }\n\n return html`\n <ox-input-file accept=\"*/*\" multiple=\"true\"></ox-input-file>\n\n <div tools>\n <label overwrite>\n <md-checkbox touch-target=\"wrapper\" checked></md-checkbox>\n ${i18next.t('label.overwrite', { defaultValue: 'overwrite' })}\n </label>\n <div filler></div>\n <md-filled-button cap @click=${this.importBoard.bind(this)}>\n <md-icon slot=\"icon\">publish</md-icon>${i18next.t('button.import-board')}\n </md-filled-button>\n </div>\n `\n }\n\n updated(changes) {\n if (changes.has('groupId')) {\n this.refresh()\n }\n }\n\n async refresh() {\n if (!this.groupId) {\n this.group = { name: '', description: '' }\n } else {\n const response = await fetchGroup(this.groupId)\n this.group = response.group\n }\n }\n\n async importBoard() {\n this.dispatchEvent(\n new CustomEvent('import-boards', {\n bubbles: true,\n composed: true,\n detail: {\n group: this.group,\n files: this.fileUploader.files,\n overwrite: this.overwrite.checked\n }\n })\n )\n\n this.close()\n }\n\n close() {\n history.back()\n }\n}\n"]}
|
|
@@ -179,7 +179,18 @@ export const InfoFormStyles = css `
|
|
|
179
179
|
color: var(--md-sys-color-on-surface);
|
|
180
180
|
}
|
|
181
181
|
|
|
182
|
-
|
|
182
|
+
/*
|
|
183
|
+
* A tool row inside a dialog's body or footer - a menu, a copy-link button, an import option. It is
|
|
184
|
+
* not the dialog's closing command row, which is <ox-popup-actions>; it only lines its tools up.
|
|
185
|
+
*/
|
|
186
|
+
[tools] {
|
|
187
|
+
display: flex;
|
|
188
|
+
justify-content: flex-end;
|
|
189
|
+
align-items: center;
|
|
190
|
+
gap: var(--spacing-small, 4px);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
[tools] [filler] {
|
|
183
194
|
flex: 1;
|
|
184
195
|
}
|
|
185
196
|
|