@things-factory/board-ui 10.0.0-beta.9 → 10.0.0-beta.90

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.
Files changed (105) hide show
  1. package/dist-client/apptools/favorite-tool.js +5 -5
  2. package/dist-client/apptools/favorite-tool.js.map +1 -1
  3. package/dist-client/board-list/board-tile-list.d.ts +6 -3
  4. package/dist-client/board-list/board-tile-list.js +349 -73
  5. package/dist-client/board-list/board-tile-list.js.map +1 -1
  6. package/dist-client/board-list/group-bar.js +3 -3
  7. package/dist-client/board-list/group-bar.js.map +1 -1
  8. package/dist-client/board-list/play-group-bar.d.ts +0 -1
  9. package/dist-client/board-list/play-group-bar.js +3 -6
  10. package/dist-client/board-list/play-group-bar.js.map +1 -1
  11. package/dist-client/board-provider.js +20 -8
  12. package/dist-client/board-provider.js.map +1 -1
  13. package/dist-client/data-grist/board-editor.js +4 -4
  14. package/dist-client/data-grist/board-editor.js.map +1 -1
  15. package/dist-client/data-grist/board-renderer.js +4 -4
  16. package/dist-client/data-grist/board-renderer.js.map +1 -1
  17. package/dist-client/graphql/attachment.d.ts +33 -0
  18. package/dist-client/graphql/attachment.js +87 -0
  19. package/dist-client/graphql/attachment.js.map +1 -0
  20. package/dist-client/graphql/board-import.d.ts +45 -0
  21. package/dist-client/graphql/board-import.js +104 -0
  22. package/dist-client/graphql/board-import.js.map +1 -0
  23. package/dist-client/graphql/board-template.js +1 -1
  24. package/dist-client/graphql/board-template.js.map +1 -1
  25. package/dist-client/graphql/board.d.ts +1 -0
  26. package/dist-client/graphql/board.js +31 -2
  27. package/dist-client/graphql/board.js.map +1 -1
  28. package/dist-client/graphql/group.js +1 -1
  29. package/dist-client/graphql/group.js.map +1 -1
  30. package/dist-client/graphql/play-group.js +3 -3
  31. package/dist-client/graphql/play-group.js.map +1 -1
  32. package/dist-client/pages/attachment-list-page.d.ts +16 -0
  33. package/dist-client/pages/attachment-list-page.js +63 -2
  34. package/dist-client/pages/attachment-list-page.js.map +1 -1
  35. package/dist-client/pages/board-action-dispatch.d.ts +31 -0
  36. package/dist-client/pages/board-action-dispatch.js +80 -0
  37. package/dist-client/pages/board-action-dispatch.js.map +1 -0
  38. package/dist-client/pages/board-action-dispatch.test.d.ts +1 -0
  39. package/dist-client/pages/board-action-dispatch.test.js +235 -0
  40. package/dist-client/pages/board-action-dispatch.test.js.map +1 -0
  41. package/dist-client/pages/board-create-wizard-page.d.ts +157 -0
  42. package/dist-client/pages/board-create-wizard-page.js +2176 -0
  43. package/dist-client/pages/board-create-wizard-page.js.map +1 -0
  44. package/dist-client/pages/board-edit-dispatch.d.ts +74 -0
  45. package/dist-client/pages/board-edit-dispatch.js +299 -0
  46. package/dist-client/pages/board-edit-dispatch.js.map +1 -0
  47. package/dist-client/pages/board-edit-dispatch.test.d.ts +1 -0
  48. package/dist-client/pages/board-edit-dispatch.test.js +858 -0
  49. package/dist-client/pages/board-edit-dispatch.test.js.map +1 -0
  50. package/dist-client/pages/board-list-page.d.ts +23 -3
  51. package/dist-client/pages/board-list-page.js +165 -77
  52. package/dist-client/pages/board-list-page.js.map +1 -1
  53. package/dist-client/pages/board-modeller-page.d.ts +134 -0
  54. package/dist-client/pages/board-modeller-page.js +725 -54
  55. package/dist-client/pages/board-modeller-page.js.map +1 -1
  56. package/dist-client/pages/board-player-by-name-page.js.map +1 -1
  57. package/dist-client/pages/board-player-page.js +14 -26
  58. package/dist-client/pages/board-player-page.js.map +1 -1
  59. package/dist-client/pages/board-viewer-by-name-page.d.ts +8 -1
  60. package/dist-client/pages/board-viewer-by-name-page.js +9 -1
  61. package/dist-client/pages/board-viewer-by-name-page.js.map +1 -1
  62. package/dist-client/pages/board-viewer-page.d.ts +2 -1
  63. package/dist-client/pages/board-viewer-page.js +52 -48
  64. package/dist-client/pages/board-viewer-page.js.map +1 -1
  65. package/dist-client/pages/play-list-page.d.ts +0 -1
  66. package/dist-client/pages/play-list-page.js +26 -33
  67. package/dist-client/pages/play-list-page.js.map +1 -1
  68. package/dist-client/pages/printable-board-viewer-page.js +2 -2
  69. package/dist-client/pages/printable-board-viewer-page.js.map +1 -1
  70. package/dist-client/route.d.ts +1 -1
  71. package/dist-client/route.js +3 -0
  72. package/dist-client/route.js.map +1 -1
  73. package/dist-client/setting-let/board-view-setting-let.js +1 -1
  74. package/dist-client/setting-let/board-view-setting-let.js.map +1 -1
  75. package/dist-client/themes/board-theme.css +4 -1
  76. package/dist-client/tsconfig.tsbuildinfo +1 -1
  77. package/dist-client/utils/notify-helper.d.ts +7 -0
  78. package/dist-client/utils/notify-helper.js +28 -0
  79. package/dist-client/utils/notify-helper.js.map +1 -0
  80. package/dist-client/utils/query-utils.d.ts +1 -0
  81. package/dist-client/utils/query-utils.js +26 -0
  82. package/dist-client/utils/query-utils.js.map +1 -0
  83. package/dist-client/viewparts/board-basic-info.js +9 -13
  84. package/dist-client/viewparts/board-basic-info.js.map +1 -1
  85. package/dist-client/viewparts/board-template-info.d.ts +0 -1
  86. package/dist-client/viewparts/board-template-info.js +5 -13
  87. package/dist-client/viewparts/board-template-info.js.map +1 -1
  88. package/dist-client/viewparts/board-versions.js +1 -1
  89. package/dist-client/viewparts/board-versions.js.map +1 -1
  90. package/dist-client/viewparts/group-info-basic.js +2 -2
  91. package/dist-client/viewparts/group-info-basic.js.map +1 -1
  92. package/dist-client/viewparts/group-info-import.js +2 -2
  93. package/dist-client/viewparts/group-info-import.js.map +1 -1
  94. package/dist-client/viewparts/link-builder.js +1 -1
  95. package/dist-client/viewparts/link-builder.js.map +1 -1
  96. package/dist-client/viewparts/play-group-info-basic.js +2 -2
  97. package/dist-client/viewparts/play-group-info-basic.js.map +1 -1
  98. package/dist-server/tsconfig.tsbuildinfo +1 -1
  99. package/package.json +6 -5
  100. package/things-factory.config.js +1 -0
  101. package/translations/en.json +71 -30
  102. package/translations/ja.json +3 -29
  103. package/translations/ko.json +71 -30
  104. package/translations/ms.json +3 -29
  105. package/translations/zh.json +3 -29
@@ -24,7 +24,7 @@ let FavoriteTool = class FavoriteTool extends LitElement {
24
24
  }
25
25
  `; }
26
26
  render() {
27
- var renderable = (this.acceptedPages || []).indexOf(this.page) !== -1;
27
+ const renderable = (this.acceptedPages || []).indexOf(this.page) !== -1;
28
28
  return renderable
29
29
  ? html `
30
30
  <md-icon @click=${this.onClick.bind(this)} ?favorable=${!this.favored}
@@ -86,8 +86,8 @@ let FavoriteTool = class FavoriteTool extends LitElement {
86
86
  });
87
87
  }
88
88
  async removeFavorite(routing) {
89
- await client.query({
90
- query: gql `
89
+ await client.mutate({
90
+ mutation: gql `
91
91
  mutation {
92
92
  deleteFavorite(routing: "${routing}")
93
93
  }
@@ -96,8 +96,8 @@ let FavoriteTool = class FavoriteTool extends LitElement {
96
96
  this.refreshFavorites();
97
97
  }
98
98
  async addFavorite(routing) {
99
- await client.query({
100
- query: gql `
99
+ await client.mutate({
100
+ mutation: gql `
101
101
  mutation {
102
102
  createFavorite(favorite: {
103
103
  routing: "${routing}"
@@ -1 +1 @@
1
- {"version":3,"file":"favorite-tool.js","sourceRoot":"","sources":["../../client/apptools/favorite-tool.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { store } from '@operato/shell'\nimport { client } from '@operato/graphql'\n\nimport { UPDATE_FAVORITES } from '@things-factory/fav-base/client/index.js'\n\n@customElement('favorite-tool')\nexport class FavoriteTool extends LitElement {\n static styles = css`\n :host {\n display: inline-block;\n vertical-align: middle;\n line-height: 0;\n }\n\n [favorable] {\n opacity: 0.5;\n }\n `\n\n @property({ type: Array }) favorites: any[] = []\n @property({ type: Object }) user: any\n @property({ type: String }) resourceId?: string\n @property({ type: Boolean }) favored?: boolean\n @property({ type: Array }) acceptedPages: any[] = []\n\n page: any\n\n render() {\n var renderable = (this.acceptedPages || []).indexOf(this.page) !== -1\n\n return renderable\n ? html`\n <md-icon @click=${this.onClick.bind(this)} ?favorable=${!this.favored}\n >${this.favored ? 'star' : 'star_border'}</md-icon\n >\n `\n : nothing\n }\n\n updated(changes) {\n if (changes.has('user')) {\n this.refreshFavorites()\n }\n\n this.favored = (this.favorites || []).includes(this.resourceId)\n }\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.page = __state__.route.page\n this.favorites = __state__.favorite.favorites\n this.user = __state__.auth.user\n this.resourceId = __state__.route.resourceId\n\n }\n\n onClick(event) {\n if (!this.resourceId) {\n return\n }\n\n if (this.favored) {\n this.removeFavorite(this.resourceId)\n } else {\n this.addFavorite(this.resourceId)\n }\n }\n\n async refreshFavorites() {\n if (!this.user || !this.user.email) {\n return\n }\n\n const response = await client.query({\n query: gql`\n query {\n myFavorites {\n id\n routing\n }\n }\n `\n })\n\n store.dispatch({\n type: UPDATE_FAVORITES,\n favorites: response.data.myFavorites.map(favorite => favorite.routing)\n })\n }\n\n async removeFavorite(routing) {\n await client.query({\n query: gql`\n mutation {\n deleteFavorite(routing: \"${routing}\")\n }\n `\n })\n\n this.refreshFavorites()\n }\n\n async addFavorite(routing) {\n await client.query({\n query: gql`\n mutation {\n createFavorite(favorite: {\n routing: \"${routing}\"\n }) {\n id\n routing\n }\n }\n `\n })\n\n this.refreshFavorites()\n }\n}\n"]}
1
+ {"version":3,"file":"favorite-tool.js","sourceRoot":"","sources":["../../client/apptools/favorite-tool.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AAEnC,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,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAA;AAGpE,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,UAAU;IAArC;;QAasB,cAAS,GAAU,EAAE,CAAA;QAIrB,kBAAa,GAAU,EAAE,CAAA;IAuHtD,CAAC;aAvIQ,WAAM,GAAG,GAAG,CAAA;;;;;;;;;;GAUlB,AAVY,CAUZ;IAUD,MAAM;QACJ,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAEvE,OAAO,UAAU;YACf,CAAC,CAAC,IAAI,CAAA;4BACgB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO;eAChE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa;;SAE3C;YACH,CAAC,CAAC,OAAO,CAAA;IACb,CAAC;IAED,OAAO,CAAC,OAAO;QACb,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,gBAAgB,EAAE,CAAA;QACzB,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACjE,CAAC;IAKD,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,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAA;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAA;QAC7C,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAA;QAC/B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAA;IAE9C,CAAC;IAED,OAAO,CAAC,KAAK;QACX,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACtC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACnC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACnC,OAAM;QACR,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;YAClC,KAAK,EAAE,GAAG,CAAA;;;;;;;OAOT;SACF,CAAC,CAAA;QAEF,KAAK,CAAC,QAAQ,CAAC;YACb,IAAI,EAAE,gBAAgB;YACtB,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;SACvE,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAO;QAC1B,MAAM,MAAM,CAAC,MAAM,CAAC;YAClB,QAAQ,EAAE,GAAG,CAAA;;qCAEkB,OAAO;;OAErC;SACF,CAAC,CAAA;QAEF,IAAI,CAAC,gBAAgB,EAAE,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAO;QACvB,MAAM,MAAM,CAAC,MAAM,CAAC;YAClB,QAAQ,EAAE,GAAG,CAAA;;;wBAGK,OAAO;;;;;;OAMxB;SACF,CAAC,CAAA;QAEF,IAAI,CAAC,gBAAgB,EAAE,CAAA;IACzB,CAAC;;AA1H0B;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;+CAAsB;AACpB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0CAAU;AACT;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;gDAAoB;AAClB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;;6CAAkB;AACnB;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;mDAA0B;AAjBzC,YAAY;IADxB,aAAa,CAAC,eAAe,CAAC;GAClB,YAAY,CAwIxB","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { store } from '@operato/shell'\nimport { client } from '@operato/graphql'\n\nimport { UPDATE_FAVORITES } from '@things-factory/fav-base/client/index.js'\n\n@customElement('favorite-tool')\nexport class FavoriteTool extends LitElement {\n static styles = css`\n :host {\n display: inline-block;\n vertical-align: middle;\n line-height: 0;\n }\n\n [favorable] {\n opacity: 0.5;\n }\n `\n\n @property({ type: Array }) favorites: any[] = []\n @property({ type: Object }) user: any\n @property({ type: String }) resourceId?: string\n @property({ type: Boolean }) favored?: boolean\n @property({ type: Array }) acceptedPages: any[] = []\n\n page: any\n\n render() {\n const renderable = (this.acceptedPages || []).indexOf(this.page) !== -1\n\n return renderable\n ? html`\n <md-icon @click=${this.onClick.bind(this)} ?favorable=${!this.favored}\n >${this.favored ? 'star' : 'star_border'}</md-icon\n >\n `\n : nothing\n }\n\n updated(changes) {\n if (changes.has('user')) {\n this.refreshFavorites()\n }\n\n this.favored = (this.favorites || []).includes(this.resourceId)\n }\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.page = __state__.route.page\n this.favorites = __state__.favorite.favorites\n this.user = __state__.auth.user\n this.resourceId = __state__.route.resourceId\n\n }\n\n onClick(event) {\n if (!this.resourceId) {\n return\n }\n\n if (this.favored) {\n this.removeFavorite(this.resourceId)\n } else {\n this.addFavorite(this.resourceId)\n }\n }\n\n async refreshFavorites() {\n if (!this.user || !this.user.email) {\n return\n }\n\n const response = await client.query({\n query: gql`\n query {\n myFavorites {\n id\n routing\n }\n }\n `\n })\n\n store.dispatch({\n type: UPDATE_FAVORITES,\n favorites: response.data.myFavorites.map(favorite => favorite.routing)\n })\n }\n\n async removeFavorite(routing) {\n await client.mutate({\n mutation: gql`\n mutation {\n deleteFavorite(routing: \"${routing}\")\n }\n `\n })\n\n this.refreshFavorites()\n }\n\n async addFavorite(routing) {\n await client.mutate({\n mutation: gql`\n mutation {\n createFavorite(favorite: {\n routing: \"${routing}\"\n }) {\n id\n routing\n }\n }\n `\n })\n\n this.refreshFavorites()\n }\n}\n"]}
@@ -1,5 +1,4 @@
1
1
  import '@material/web/icon/icon.js';
2
- import '@operato/board/ox-board-creation-card.js';
3
2
  import { LitElement, PropertyValues } from 'lit';
4
3
  export declare class BoardTileList extends LitElement {
5
4
  static styles: import("lit").CSSResult[];
@@ -10,11 +9,15 @@ export declare class BoardTileList extends LitElement {
10
9
  creatable?: boolean;
11
10
  searchText?: string;
12
11
  reorderable: boolean;
13
- private draggedItem;
12
+ updatedIds: string[];
13
+ private _draggedId;
14
+ private _dropTargetId;
15
+ private _dropSide;
14
16
  connectedCallback(): void;
17
+ private _clearDropIndicator;
18
+ private _resetDragState;
15
19
  render(): import("lit-html").TemplateResult<1>;
16
20
  updated(changes: PropertyValues<this>): void;
17
- onCreateBoard(e: any): void;
18
21
  infoBoard(board: any): void;
19
22
  removeFavorite(boardId: any): Promise<void>;
20
23
  addFavorite(boardId: any): Promise<void>;
@@ -1,11 +1,11 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
2
  import '@material/web/icon/icon.js';
3
- import '@operato/board/ox-board-creation-card.js';
4
3
  import gql from 'graphql-tag';
5
4
  import { css, html, LitElement, nothing } from 'lit';
6
5
  import { customElement, property } from 'lit/decorators.js';
7
- import { keyed } from 'lit/directives/keyed.js';
6
+ import { repeat } from 'lit/directives/repeat.js';
8
7
  import { client } from '@operato/graphql';
8
+ import { i18next } from '@operato/i18n';
9
9
  import { privileged } from '@things-factory/auth-base/dist-client/index.js';
10
10
  let BoardTileList = class BoardTileList extends LitElement {
11
11
  constructor() {
@@ -15,6 +15,10 @@ let BoardTileList = class BoardTileList extends LitElement {
15
15
  this.groups = [];
16
16
  this.creatable = false;
17
17
  this.reorderable = false;
18
+ this.updatedIds = [];
19
+ this._draggedId = null;
20
+ this._dropTargetId = null;
21
+ this._dropSide = null;
18
22
  }
19
23
  static { this.styles = [
20
24
  css `
@@ -40,29 +44,77 @@ let BoardTileList = class BoardTileList extends LitElement {
40
44
  background-color: initial;
41
45
  }
42
46
 
47
+ [card][import-card] > a {
48
+ display: flex;
49
+ align-items: center;
50
+ justify-content: center;
51
+ height: calc(100% - 25px);
52
+ border: 1px dashed var(--md-sys-color-outline-variant, #b8c2cc);
53
+ border-radius: var(--card-list-border-radius, 8px);
54
+ text-decoration: none;
55
+ color: var(--md-sys-color-on-secondary-container, #555);
56
+ background: var(--md-sys-color-surface-container, #fff);
57
+ box-sizing: border-box;
58
+ }
59
+ [card][import-card] > a:hover {
60
+ border-color: var(--md-sys-color-primary, #2a64d8);
61
+ color: var(--md-sys-color-primary, #2a64d8);
62
+ background: var(--md-sys-color-primary-container, #eaf2ff);
63
+ }
64
+ [card][import-card] md-icon {
65
+ font-size: 48px;
66
+ --md-icon-size: 48px;
67
+ }
68
+
43
69
  [card] > a {
44
70
  display: flex;
71
+ align-items: center;
72
+ justify-content: center;
45
73
  clip-path: border-box;
74
+ padding: var(--spacing-large);
75
+ box-sizing: border-box;
46
76
  }
47
77
 
48
78
  [card]:hover {
49
79
  cursor: pointer;
50
80
  }
51
81
 
82
+ /* 데스크탑 (hover 가능 + 정밀 포인터): 액션 아이콘 fade-in.
83
+ * favored 별은 *상태 표시* 라 호버 무관하게 보임 — 어떤 보드가 즐겨찾기인지
84
+ * 한눈에. unfavored 별 + info 만 호버 시 노출.
85
+ * 모바일/터치 환경에서는 hover 가 없으므로 이 블록이 미적용 → 기본 동작
86
+ * (별/메뉴 항상 노출) 그대로 유지. */
87
+ @media (hover: hover) and (pointer: fine) {
88
+ md-icon[iconBtn]:not([favored]) {
89
+ opacity: 0;
90
+ transition: opacity 0.2s ease;
91
+ }
92
+
93
+ [card]:hover md-icon[iconBtn] {
94
+ opacity: 1;
95
+ }
96
+ }
97
+
52
98
  [name] {
53
99
  text-overflow: ellipsis;
54
100
  white-space: nowrap;
55
101
  overflow: hidden;
56
102
  margin-top: var(--spacing-small);
57
- width: calc(100% - 45px);
103
+ margin-left: var(--spacing-large);
104
+ /* 좌측 inset (margin-left) + 우측 액션 영역 (45px) + 우측 inset = 양쪽 대칭 */
105
+ width: calc(100% - 45px - var(--spacing-large) * 2);
58
106
  color: var(--md-sys-color-on-background);
59
107
  font-weight: bolder;
60
108
  font-size: var(--fontsize-small);
61
109
  }
62
110
 
63
111
  img {
64
- flex: 1;
112
+ max-width: 100%;
113
+ max-height: 100%;
114
+ width: auto;
115
+ height: auto;
65
116
  object-fit: contain;
117
+ border-radius: var(--card-list-thumbnail-radius);
66
118
  }
67
119
 
68
120
  md-icon[iconBtn] {
@@ -72,8 +124,10 @@ let BoardTileList = class BoardTileList extends LitElement {
72
124
  color: var(--board-list-star-color);
73
125
  font-size: 1.4em;
74
126
  }
75
- md-icon[info] {
127
+ /* info 가 render 순서상 첫째 = float right 시 가장 우측 — 카드 우측 inset 적용 */
128
+ md-icon[iconBtn][info] {
76
129
  color: var(--md-sys-color-primary);
130
+ margin-right: var(--spacing-large);
77
131
  }
78
132
 
79
133
  md-icon[iconBtn][favored],
@@ -92,121 +146,339 @@ let BoardTileList = class BoardTileList extends LitElement {
92
146
  height: calc(100% - 25px);
93
147
  }
94
148
 
95
- :host > *:hover [info] {
96
- opacity: 1;
97
- -webkit-transition: opacity 0.8s;
98
- -moz-transition: opacity 0.8s;
99
- -o-transition: opacity 0.8s;
100
- transition: opacity 0.8s;
101
- }
102
-
103
149
  [draggable='true'] {
104
150
  cursor: grab;
151
+ transition: opacity 0.2s ease, transform 0.2s ease;
152
+ }
153
+
154
+ [card].dragging {
155
+ opacity: 0.3;
156
+ transform: scale(0.95);
157
+ }
158
+
159
+ [card].drop-before {
160
+ border-left: 3px solid var(--md-sys-color-primary);
161
+ }
162
+
163
+ [card].drop-after {
164
+ border-right: 3px solid var(--md-sys-color-primary);
165
+ }
166
+
167
+ [card].flip-moving {
168
+ transition: transform 1s cubic-bezier(0.25, 0.1, 0.25, 1);
169
+ }
170
+
171
+ @keyframes drop-land {
172
+ 0% {
173
+ opacity: 0;
174
+ transform: scale(0.9);
175
+ }
176
+ 100% {
177
+ opacity: 1;
178
+ transform: scale(1);
179
+ }
180
+ }
181
+
182
+ [card].flip-dropped-hidden {
183
+ opacity: 0;
184
+ }
185
+
186
+ [card].flip-dropped {
187
+ animation: drop-land 0.5s cubic-bezier(0.22, 0.6, 0.36, 1);
188
+ }
189
+
190
+ @keyframes highlight-sweep {
191
+ 0% {
192
+ background: linear-gradient(90deg, var(--md-sys-color-primary-container) 0%, transparent 0%);
193
+ box-shadow: 0 0 8px 2px var(--md-sys-color-primary);
194
+ }
195
+ 50% {
196
+ background: linear-gradient(90deg, transparent 0%, var(--md-sys-color-primary-container) 50%, transparent 100%);
197
+ box-shadow: 0 0 12px 3px var(--md-sys-color-primary);
198
+ }
199
+ 100% {
200
+ background: transparent;
201
+ box-shadow: none;
202
+ }
105
203
  }
106
204
 
107
- @media screen and (max-width: 800px), screen and (max-height: 600px) {
108
- ox-board-creation-card {
109
- display: none;
205
+ @keyframes border-pulse {
206
+ 0%,
207
+ 100% {
208
+ outline: 2px solid transparent;
209
+ }
210
+ 25%,
211
+ 75% {
212
+ outline: 2px solid var(--md-sys-color-primary);
213
+ }
214
+ }
215
+
216
+ @keyframes subtle-bounce {
217
+ 0% {
218
+ transform: scale(1);
219
+ }
220
+ 30% {
221
+ transform: scale(1.03);
222
+ }
223
+ 100% {
224
+ transform: scale(1);
225
+ }
226
+ }
227
+
228
+ @keyframes surface-flash {
229
+ 0% {
230
+ background-color: var(--md-sys-color-primary-container);
231
+ }
232
+ 100% {
233
+ background-color: transparent;
110
234
  }
111
235
  }
236
+
237
+ [card].anim-sweep {
238
+ animation: highlight-sweep 1.8s ease;
239
+ border-radius: 4px;
240
+ }
241
+
242
+ [card].anim-pulse {
243
+ animation: border-pulse 1.2s ease;
244
+ }
245
+
246
+ [card].anim-bounce {
247
+ animation: subtle-bounce 0.8s ease;
248
+ }
249
+
250
+ [card].anim-flash {
251
+ animation: surface-flash 1.5s ease-out;
252
+ }
253
+
112
254
  `
113
255
  ]; }
114
256
  connectedCallback() {
115
257
  super.connectedCallback();
116
258
  if (this.reorderable) {
117
259
  this.renderRoot.addEventListener('dragstart', (e) => {
118
- const target = e.target;
119
- this.draggedItem = target.closest('[card]');
120
- e.dataTransfer?.setData('text/plain', target.innerHTML);
260
+ const target = e.target.closest('[card]');
261
+ if (!target?.id)
262
+ return;
263
+ this._draggedId = target.id;
264
+ target.classList.add('dragging');
265
+ e.dataTransfer.effectAllowed = 'move';
266
+ e.dataTransfer?.setData('text/plain', target.id);
121
267
  });
122
268
  this.renderRoot.addEventListener('dragover', (e) => {
123
269
  e.preventDefault();
124
- const target = e.target;
125
- const targetItem = target.closest('[card]');
126
- if (targetItem && targetItem !== this.draggedItem) {
127
- const targetRect = targetItem.getBoundingClientRect();
128
- const mousePos = e.clientX - targetRect.left;
129
- if (mousePos < targetRect.width / 2) {
130
- // 마우스 위치가 아이템 좌측 반절에 있을
131
- this.renderRoot.insertBefore(this.draggedItem, targetItem);
132
- }
133
- else {
134
- // 마우스 위치가 아이템 우측 반절에 있을 때
135
- this.renderRoot.insertBefore(this.draggedItem, targetItem.nextSibling);
270
+ e.dataTransfer.dropEffect = 'move';
271
+ const target = e.target.closest('[card]');
272
+ if (!target?.id || target.id === this._draggedId)
273
+ return;
274
+ const targetRect = target.getBoundingClientRect();
275
+ const mousePos = e.clientX - targetRect.left;
276
+ const side = mousePos < targetRect.width / 2 ? 'before' : 'after';
277
+ if (this._dropTargetId !== target.id || this._dropSide !== side) {
278
+ this._clearDropIndicator();
279
+ this._dropTargetId = target.id;
280
+ this._dropSide = side;
281
+ target.classList.add(side === 'before' ? 'drop-before' : 'drop-after');
282
+ }
283
+ });
284
+ this.renderRoot.addEventListener('dragleave', (e) => {
285
+ const target = e.target.closest('[card]');
286
+ if (target?.id === this._dropTargetId) {
287
+ const related = e.relatedTarget;
288
+ if (!related || !target.contains(related)) {
289
+ this._clearDropIndicator();
136
290
  }
137
291
  }
138
292
  });
139
293
  this.renderRoot.addEventListener('drop', (e) => {
140
294
  e.preventDefault();
141
- const boardIds = Array.from(this.renderRoot.querySelectorAll('[card]'))
142
- .map(board => board.getAttribute('id'))
143
- .filter(Boolean);
144
- this.dispatchEvent(new CustomEvent('reordered', {
145
- detail: {
146
- groupId: this.group,
147
- boardIds
295
+ // drop 이벤트에서 직접 타겟과 방향을 계산 (dragleave가 먼저 발생해 상태를 지울 수 있으므로)
296
+ const dropTarget = e.target.closest('[card]');
297
+ let dropTargetId = this._dropTargetId;
298
+ let dropSide = this._dropSide;
299
+ if (dropTarget?.id && dropTarget.id !== this._draggedId) {
300
+ dropTargetId = dropTarget.id;
301
+ const rect = dropTarget.getBoundingClientRect();
302
+ dropSide = e.clientX - rect.left < rect.width / 2 ? 'before' : 'after';
303
+ }
304
+ this._clearDropIndicator();
305
+ const draggedEl = this._draggedId ? this.renderRoot.querySelector(`[card][id="${this._draggedId}"]`) : null;
306
+ if (draggedEl) {
307
+ draggedEl.classList.remove('dragging');
308
+ }
309
+ if (!this._draggedId || !dropTargetId || this._draggedId === dropTargetId) {
310
+ this._resetDragState();
311
+ return;
312
+ }
313
+ // 배열 재정렬
314
+ const boards = [...this.boards];
315
+ const draggedIndex = boards.findIndex(b => b.id === this._draggedId);
316
+ if (draggedIndex === -1) {
317
+ this._resetDragState();
318
+ return;
319
+ }
320
+ const draggedBoardId = this._draggedId;
321
+ const [dragged] = boards.splice(draggedIndex, 1);
322
+ let targetIndex = boards.findIndex(b => b.id === dropTargetId);
323
+ if (dropSide === 'after')
324
+ targetIndex++;
325
+ boards.splice(targetIndex, 0, dragged);
326
+ this._resetDragState();
327
+ // FLIP 애니메이션: 이전 위치 기록
328
+ const cards = this.renderRoot.querySelectorAll('[card][id]');
329
+ const firstPositions = new Map();
330
+ cards.forEach(card => {
331
+ firstPositions.set(card.id, card.getBoundingClientRect());
332
+ });
333
+ // optimistic update → Lit 렌더
334
+ this.boards = boards;
335
+ this.updateComplete.then(() => {
336
+ const updatedCards = this.renderRoot.querySelectorAll('[card][id]');
337
+ let droppedEl = null;
338
+ updatedCards.forEach(card => {
339
+ const first = firstPositions.get(card.id);
340
+ if (!first)
341
+ return;
342
+ const last = card.getBoundingClientRect();
343
+ const dx = first.left - last.left;
344
+ const dy = first.top - last.top;
345
+ const el = card;
346
+ if (card.id === draggedBoardId) {
347
+ // 드래그한 카드: 슬라이딩 완료 후 착지하도록 일단 숨김
348
+ el.classList.add('flip-dropped-hidden');
349
+ droppedEl = el;
350
+ }
351
+ else {
352
+ // 밀려나는 카드: 이전 위치에서 새 위치로 슬라이딩
353
+ if (dx === 0 && dy === 0)
354
+ return;
355
+ // Invert: 이전 위치로 되돌림
356
+ el.style.transform = `translate(${dx}px, ${dy}px)`;
357
+ el.style.transition = 'none';
358
+ requestAnimationFrame(() => {
359
+ el.classList.add('flip-moving');
360
+ el.style.transform = '';
361
+ el.style.transition = '';
362
+ el.addEventListener('transitionend', () => {
363
+ el.classList.remove('flip-moving');
364
+ }, { once: true });
365
+ });
366
+ }
367
+ });
368
+ // 밀려나는 카드 슬라이딩 완료 후 드래그한 카드 착지 → 착지 완료 후 이벤트 발송
369
+ const boardIds = boards.map(b => b.id);
370
+ const dispatchReordered = () => {
371
+ this.dispatchEvent(new CustomEvent('reordered', {
372
+ detail: {
373
+ groupId: this.group,
374
+ boardIds,
375
+ movedId: draggedBoardId
376
+ }
377
+ }));
378
+ };
379
+ if (droppedEl) {
380
+ setTimeout(() => {
381
+ ;
382
+ droppedEl.classList.remove('flip-dropped-hidden');
383
+ droppedEl.classList.add('flip-dropped');
384
+ droppedEl.addEventListener('animationend', () => {
385
+ ;
386
+ droppedEl.classList.remove('flip-dropped');
387
+ dispatchReordered();
388
+ }, { once: true });
389
+ }, 500);
390
+ }
391
+ else {
392
+ dispatchReordered();
148
393
  }
149
- }));
394
+ });
150
395
  });
396
+ this.renderRoot.addEventListener('dragend', (e) => {
397
+ this._clearDropIndicator();
398
+ const target = e.target.closest('[card]');
399
+ if (target)
400
+ target.classList.remove('dragging');
401
+ this._resetDragState();
402
+ });
403
+ }
404
+ }
405
+ _clearDropIndicator() {
406
+ if (this._dropTargetId) {
407
+ const el = this.renderRoot.querySelector(`[card][id="${this._dropTargetId}"]`);
408
+ if (el) {
409
+ el.classList.remove('drop-before', 'drop-after');
410
+ }
151
411
  }
412
+ this._dropTargetId = null;
413
+ this._dropSide = null;
414
+ }
415
+ _resetDragState() {
416
+ this._draggedId = null;
417
+ this._dropTargetId = null;
418
+ this._dropSide = null;
152
419
  }
153
420
  render() {
154
- var boards = this.boards || [];
421
+ const boards = this.boards || [];
155
422
  return html `
156
423
  ${this.creatable
157
424
  ? privileged({ privilege: 'mutation', category: 'board' }, html `
158
- <ox-board-creation-card
159
- .groups=${this.groups}
160
- .defaultGroup=${this.group}
161
- @create-board=${e => this.onCreateBoard(e)}
162
- card
163
- create
164
- ></ox-board-creation-card>
425
+ <div card import-card>
426
+ <a href="board-create" title=${i18next.t('text.create board') || 'Create New Board'}>
427
+ <md-icon>add_circle_outline</md-icon>
428
+ </a>
429
+ <div name>${i18next.t('label.create board') || 'Create Board'}</div>
430
+ </div>
165
431
  `)
166
432
  : nothing}
167
- ${keyed(Date.now(), boards.map(board => html `
168
- <div card draggable="true" id=${board.id}>
169
- <a href="board-viewer/${board.id}"> <img src=${board.thumbnail} /> </a>
433
+ ${repeat(boards, board => board.id, board => html `
434
+ <div card draggable="true" id=${board.id}>
435
+ <a href="board-viewer/${board.id}">
436
+ <img src=${board.thumbnail} />
437
+ </a>
170
438
 
171
- <div name>${board.name}</div>
172
- <!-- <div description>${board.description}</div> -->
439
+ <div name>${board.name}</div>
440
+ <!-- <div description>${board.description}</div> -->
173
441
 
174
- <md-icon
175
- iconBtn
176
- info
177
- @click=${e => {
442
+ <md-icon
443
+ iconBtn
444
+ info
445
+ @click=${e => {
178
446
  this.infoBoard(board);
179
447
  e.preventDefault();
180
448
  }}
181
- >info</md-icon
182
- >
449
+ >info</md-icon
450
+ >
183
451
 
184
- ${(this.favorites || []).includes(board.id)
452
+ ${(this.favorites || []).includes(board.id)
185
453
  ? html ` <md-icon iconBtn favored @click=${e => this.removeFavorite(board.id)}>star</md-icon> `
186
454
  : html ` <md-icon iconBtn @click=${e => this.addFavorite(board.id)}>star_border</md-icon> `}
187
- </div>
188
- `))}
455
+ </div>
456
+ `)}
189
457
  `;
190
458
  }
191
459
  updated(changes) {
192
- var creationCard = this.renderRoot.querySelector('ox-board-creation-card');
193
- if (creationCard) {
194
- creationCard.reset();
460
+ if (changes.has('updatedIds') && this.updatedIds.length > 0) {
461
+ const animClasses = ['anim-sweep', 'anim-pulse', 'anim-bounce', 'anim-flash'];
462
+ for (const id of this.updatedIds) {
463
+ const card = this.renderRoot.querySelector(`[card][id="${id}"]`);
464
+ if (!card)
465
+ continue;
466
+ const animClass = animClasses[Math.floor(Math.random() * animClasses.length)];
467
+ card.classList.add(animClass);
468
+ card.addEventListener('animationend', () => {
469
+ card.classList.remove(animClass);
470
+ }, { once: true });
471
+ }
195
472
  }
196
473
  }
197
- onCreateBoard(e) {
198
- this.dispatchEvent(new CustomEvent('create-board', {
199
- detail: e.detail
200
- }));
201
- }
202
474
  infoBoard(board) {
203
475
  this.dispatchEvent(new CustomEvent('info-board', {
204
476
  detail: board
205
477
  }));
206
478
  }
207
479
  async removeFavorite(boardId) {
208
- await client.query({
209
- query: gql `
480
+ await client.mutate({
481
+ mutation: gql `
210
482
  mutation {
211
483
  deleteFavorite(routing: "${boardId}")
212
484
  }
@@ -215,8 +487,8 @@ let BoardTileList = class BoardTileList extends LitElement {
215
487
  this.refreshFavorites();
216
488
  }
217
489
  async addFavorite(boardId) {
218
- await client.query({
219
- query: gql `
490
+ await client.mutate({
491
+ mutation: gql `
220
492
  mutation {
221
493
  createFavorite(favorite: {
222
494
  routing: "${boardId}"
@@ -261,6 +533,10 @@ __decorate([
261
533
  property({ type: Boolean, attribute: 'reorderable' }),
262
534
  __metadata("design:type", Boolean)
263
535
  ], BoardTileList.prototype, "reorderable", void 0);
536
+ __decorate([
537
+ property({ type: Array }),
538
+ __metadata("design:type", Array)
539
+ ], BoardTileList.prototype, "updatedIds", void 0);
264
540
  BoardTileList = __decorate([
265
541
  customElement('board-tile-list')
266
542
  ], BoardTileList);