@brilo/base-blocks 0.1.27 → 0.1.29

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 (145) hide show
  1. package/build/.tsbuildinfo +1 -1
  2. package/build/blocks/career/career-header/edit.d.ts +6 -0
  3. package/build/blocks/career/career-header/edit.d.ts.map +1 -0
  4. package/build/blocks/career/career-header/edit.js +11 -0
  5. package/build/blocks/career/career-header/factory.d.ts +5 -0
  6. package/build/blocks/career/career-header/factory.d.ts.map +1 -0
  7. package/build/blocks/career/career-header/factory.js +24 -0
  8. package/build/blocks/career/career-header/icon.d.ts +2 -0
  9. package/build/blocks/career/career-header/icon.d.ts.map +1 -0
  10. package/build/blocks/career/career-header/icon.js +2 -0
  11. package/build/blocks/career/career-header/index.d.ts +5 -0
  12. package/build/blocks/career/career-header/index.d.ts.map +1 -0
  13. package/build/blocks/career/career-header/index.js +4 -0
  14. package/build/blocks/career/career-header/types.d.ts +10 -0
  15. package/build/blocks/career/career-header/types.d.ts.map +1 -0
  16. package/build/blocks/career/career-header/types.js +1 -0
  17. package/build/blocks/career/job-position-group/JobPositionsSelectModal.d.ts +9 -0
  18. package/build/blocks/career/job-position-group/JobPositionsSelectModal.d.ts.map +1 -0
  19. package/build/blocks/career/job-position-group/JobPositionsSelectModal.js +123 -0
  20. package/build/blocks/career/job-position-group/constants.d.ts +10 -0
  21. package/build/blocks/career/job-position-group/constants.d.ts.map +1 -0
  22. package/build/blocks/career/job-position-group/constants.js +9 -0
  23. package/build/blocks/career/job-position-group/edit.d.ts +6 -0
  24. package/build/blocks/career/job-position-group/edit.d.ts.map +1 -0
  25. package/build/blocks/career/job-position-group/edit.js +17 -0
  26. package/build/blocks/career/job-position-group/factory.d.ts +5 -0
  27. package/build/blocks/career/job-position-group/factory.d.ts.map +1 -0
  28. package/build/blocks/career/job-position-group/factory.js +44 -0
  29. package/build/blocks/career/job-position-group/icon.d.ts +2 -0
  30. package/build/blocks/career/job-position-group/icon.d.ts.map +1 -0
  31. package/build/blocks/career/job-position-group/icon.js +2 -0
  32. package/build/blocks/career/job-position-group/index.d.ts +6 -0
  33. package/build/blocks/career/job-position-group/index.d.ts.map +1 -0
  34. package/build/blocks/career/job-position-group/index.js +5 -0
  35. package/build/blocks/career/job-position-group/types.d.ts +20 -0
  36. package/build/blocks/career/job-position-group/types.d.ts.map +1 -0
  37. package/build/blocks/career/job-position-group/types.js +1 -0
  38. package/build/blocks/document/documents-group/DocumentsSelectModal.d.ts +12 -0
  39. package/build/blocks/document/documents-group/DocumentsSelectModal.d.ts.map +1 -0
  40. package/build/blocks/document/documents-group/DocumentsSelectModal.js +153 -0
  41. package/build/blocks/document/documents-group/constants.d.ts +7 -0
  42. package/build/blocks/document/documents-group/constants.d.ts.map +1 -0
  43. package/build/blocks/document/documents-group/constants.js +5 -0
  44. package/build/blocks/document/documents-group/edit.d.ts +6 -0
  45. package/build/blocks/document/documents-group/edit.d.ts.map +1 -0
  46. package/build/blocks/document/documents-group/edit.js +27 -0
  47. package/build/blocks/document/documents-group/factory.d.ts +5 -0
  48. package/build/blocks/document/documents-group/factory.d.ts.map +1 -0
  49. package/build/blocks/document/documents-group/factory.js +50 -0
  50. package/build/blocks/document/documents-group/icon.d.ts +2 -0
  51. package/build/blocks/document/documents-group/icon.d.ts.map +1 -0
  52. package/build/blocks/document/documents-group/icon.js +2 -0
  53. package/build/blocks/document/documents-group/index.d.ts +6 -0
  54. package/build/blocks/document/documents-group/index.d.ts.map +1 -0
  55. package/build/blocks/document/documents-group/index.js +5 -0
  56. package/build/blocks/document/documents-group/types.d.ts +22 -0
  57. package/build/blocks/document/documents-group/types.d.ts.map +1 -0
  58. package/build/blocks/document/documents-group/types.js +1 -0
  59. package/build/blocks/layout/layout-aside/factory.d.ts.map +1 -1
  60. package/build/blocks/layout/layout-aside/icon.d.ts.map +1 -1
  61. package/build/blocks/layout/layout-content/factory.d.ts.map +1 -1
  62. package/build/blocks/layout/layout-content/icon.d.ts.map +1 -1
  63. package/build/blocks/layout/layout-content-w-aside/edit.d.ts.map +1 -1
  64. package/build/blocks/layout/layout-content-w-aside/edit.js +1 -1
  65. package/build/blocks/layout/layout-content-w-aside/factory.d.ts.map +1 -1
  66. package/build/blocks/layout/layout-content-w-aside/icon.d.ts.map +1 -1
  67. package/build/blocks/post/post-content/edit.d.ts +6 -0
  68. package/build/blocks/post/post-content/edit.d.ts.map +1 -0
  69. package/build/blocks/post/post-content/edit.js +9 -0
  70. package/build/blocks/post/post-content/factory.d.ts +5 -0
  71. package/build/blocks/post/post-content/factory.d.ts.map +1 -0
  72. package/build/blocks/post/post-content/factory.js +18 -0
  73. package/build/blocks/post/post-content/icon.d.ts +2 -0
  74. package/build/blocks/post/post-content/icon.d.ts.map +1 -0
  75. package/build/blocks/post/post-content/icon.js +2 -0
  76. package/build/blocks/post/post-content/index.d.ts +5 -0
  77. package/build/blocks/post/post-content/index.d.ts.map +1 -0
  78. package/build/blocks/post/post-content/index.js +4 -0
  79. package/build/blocks/post/post-content/types.d.ts +5 -0
  80. package/build/blocks/post/post-content/types.d.ts.map +1 -0
  81. package/build/blocks/post/post-content/types.js +1 -0
  82. package/build/blocks/sections/base-section/controls.d.ts.map +1 -1
  83. package/build/blocks/sections/base-section/controls.js +1 -1
  84. package/build/blocks/share/share/constants.d.ts +2 -0
  85. package/build/blocks/share/share/constants.d.ts.map +1 -0
  86. package/build/blocks/share/share/constants.js +1 -0
  87. package/build/blocks/share/share/edit.d.ts +6 -0
  88. package/build/blocks/share/share/edit.d.ts.map +1 -0
  89. package/build/blocks/share/share/edit.js +18 -0
  90. package/build/blocks/share/share/factory.d.ts +5 -0
  91. package/build/blocks/share/share/factory.d.ts.map +1 -0
  92. package/build/blocks/share/share/factory.js +26 -0
  93. package/build/blocks/share/share/icon.d.ts +2 -0
  94. package/build/blocks/share/share/icon.d.ts.map +1 -0
  95. package/build/blocks/share/share/icon.js +2 -0
  96. package/build/blocks/share/share/index.d.ts +5 -0
  97. package/build/blocks/share/share/index.d.ts.map +1 -0
  98. package/build/blocks/share/share/index.js +4 -0
  99. package/build/blocks/share/share/types.d.ts +11 -0
  100. package/build/blocks/share/share/types.d.ts.map +1 -0
  101. package/build/blocks/share/share/types.js +1 -0
  102. package/build/index.d.ts +10 -0
  103. package/build/index.d.ts.map +1 -1
  104. package/build/index.js +5 -0
  105. package/package.json +6 -1
  106. package/src/blocks/career/career-header/edit.tsx +61 -0
  107. package/src/blocks/career/career-header/factory.tsx +28 -0
  108. package/src/blocks/career/career-header/icon.tsx +8 -0
  109. package/src/blocks/career/career-header/index.ts +8 -0
  110. package/src/blocks/career/career-header/types.ts +11 -0
  111. package/src/blocks/career/job-position-group/JobPositionsSelectModal.tsx +238 -0
  112. package/src/blocks/career/job-position-group/constants.ts +11 -0
  113. package/src/blocks/career/job-position-group/edit.tsx +93 -0
  114. package/src/blocks/career/job-position-group/factory.tsx +56 -0
  115. package/src/blocks/career/job-position-group/icon.tsx +7 -0
  116. package/src/blocks/career/job-position-group/index.ts +15 -0
  117. package/src/blocks/career/job-position-group/types.ts +23 -0
  118. package/src/blocks/document/documents-group/DocumentsSelectModal.tsx +273 -0
  119. package/src/blocks/document/documents-group/constants.ts +7 -0
  120. package/src/blocks/document/documents-group/edit.tsx +96 -0
  121. package/src/blocks/document/documents-group/factory.tsx +59 -0
  122. package/src/blocks/document/documents-group/icon.tsx +9 -0
  123. package/src/blocks/document/documents-group/index.ts +15 -0
  124. package/src/blocks/document/documents-group/types.ts +25 -0
  125. package/src/blocks/layout/layout-aside/factory.tsx +1 -3
  126. package/src/blocks/layout/layout-aside/icon.tsx +1 -6
  127. package/src/blocks/layout/layout-content/editor.scss +1 -1
  128. package/src/blocks/layout/layout-content/factory.tsx +1 -3
  129. package/src/blocks/layout/layout-content/icon.tsx +1 -6
  130. package/src/blocks/layout/layout-content-w-aside/edit.tsx +5 -1
  131. package/src/blocks/layout/layout-content-w-aside/factory.tsx +1 -3
  132. package/src/blocks/layout/layout-content-w-aside/icon.tsx +1 -6
  133. package/src/blocks/post/post-content/edit.tsx +18 -0
  134. package/src/blocks/post/post-content/factory.tsx +22 -0
  135. package/src/blocks/post/post-content/icon.tsx +9 -0
  136. package/src/blocks/post/post-content/index.ts +8 -0
  137. package/src/blocks/post/post-content/types.ts +6 -0
  138. package/src/blocks/sections/base-section/controls.tsx +7 -1
  139. package/src/blocks/share/share/constants.ts +1 -0
  140. package/src/blocks/share/share/edit.tsx +57 -0
  141. package/src/blocks/share/share/factory.tsx +30 -0
  142. package/src/blocks/share/share/icon.tsx +9 -0
  143. package/src/blocks/share/share/index.ts +8 -0
  144. package/src/blocks/share/share/types.ts +12 -0
  145. package/src/index.ts +22 -0
@@ -0,0 +1,6 @@
1
+ import type { CareerHeaderAttributes, CareerHeaderOptions } from './types';
2
+ export declare function createCareerHeaderEdit(_options: CareerHeaderOptions): ({ attributes, setAttributes, }: {
3
+ attributes: CareerHeaderAttributes;
4
+ setAttributes: (a: Partial<CareerHeaderAttributes>) => void;
5
+ }) => import("react").JSX.Element;
6
+ //# sourceMappingURL=edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../../src/blocks/career/career-header/edit.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,sBAAsB,EAAE,mBAAmB,EAAC,MAAM,SAAS,CAAA;AAExE,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,mBAAmB,oCAI/D;IACD,UAAU,EAAE,sBAAsB,CAAA;IAClC,aAAa,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,KAAK,IAAI,CAAA;CAC5D,iCAgDF"}
@@ -0,0 +1,11 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { InspectorControls, useBlockProps } from '@wordpress/block-editor';
3
+ import { PanelBody, ToggleControl } from '@wordpress/components';
4
+ import { __ } from '@wordpress/i18n';
5
+ export function createCareerHeaderEdit(_options) {
6
+ return function Edit({ attributes, setAttributes, }) {
7
+ const { showExcerpt, showLocation, showSalary, showBenefits, showEmploymentType } = attributes;
8
+ const blockProps = useBlockProps({ className: 'wp-block-section' });
9
+ return (_jsxs(_Fragment, { children: [_jsx(InspectorControls, { children: _jsxs(PanelBody, { title: __('Zobrazené údaje', 'brilo-blocks'), initialOpen: true, children: [_jsx(ToggleControl, { label: __('Zobrazit perex', 'brilo-blocks'), checked: showExcerpt, onChange: (value) => setAttributes({ showExcerpt: value }) }), _jsx(ToggleControl, { label: __('Zobrazit lokalitu', 'brilo-blocks'), checked: showLocation, onChange: (value) => setAttributes({ showLocation: value }) }), _jsx(ToggleControl, { label: __('Zobrazit plat', 'brilo-blocks'), checked: showSalary, onChange: (value) => setAttributes({ showSalary: value }) }), _jsx(ToggleControl, { label: __('Zobrazit benefity', 'brilo-blocks'), checked: showBenefits, onChange: (value) => setAttributes({ showBenefits: value }) }), _jsx(ToggleControl, { label: __('Zobrazit typ úvazku', 'brilo-blocks'), checked: showEmploymentType, onChange: (value) => setAttributes({ showEmploymentType: value }) })] }) }), _jsx("div", { ...blockProps, children: _jsxs("div", { className: "components-placeholder", children: [_jsx("div", { className: "components-placeholder__label", children: __('Hlavička kariéry', 'brilo-blocks') }), _jsx("div", { className: "components-placeholder__instructions", children: __('Zobrazí data aktuální pozice — název, perex, lokalitu, plat, benefity a typ úvazku.', 'brilo-blocks') })] }) })] }));
10
+ };
11
+ }
@@ -0,0 +1,5 @@
1
+ import type { BlockConfiguration } from '@wordpress/blocks';
2
+ import type { CareerHeaderAttributes, CareerHeaderOptions } from './types';
3
+ export type { CareerHeaderAttributes, CareerHeaderOptions };
4
+ export declare function createCareerHeaderBlock(options: CareerHeaderOptions): BlockConfiguration<CareerHeaderAttributes>;
5
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../../src/blocks/career/career-header/factory.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,mBAAmB,CAAA;AAIzD,OAAO,KAAK,EAAC,sBAAsB,EAAE,mBAAmB,EAAC,MAAM,SAAS,CAAA;AAExE,YAAY,EAAC,sBAAsB,EAAE,mBAAmB,EAAC,CAAA;AAEzD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CAAC,sBAAsB,CAAC,CAmBhH"}
@@ -0,0 +1,24 @@
1
+ import { __ } from '@wordpress/i18n';
2
+ import { createCareerHeaderEdit } from './edit';
3
+ import { icon as defaultIcon } from './icon';
4
+ export function createCareerHeaderBlock(options) {
5
+ var _a, _b, _c;
6
+ return {
7
+ name: options.name,
8
+ title: (_a = options.title) !== null && _a !== void 0 ? _a : __('Hlavička kariéry', 'brilo-blocks'),
9
+ description: options.description,
10
+ category: (_b = options.category) !== null && _b !== void 0 ? _b : 'widgets',
11
+ ...(options.parent && { parent: options.parent }),
12
+ icon: (_c = options.icon) !== null && _c !== void 0 ? _c : { src: defaultIcon },
13
+ supports: { html: false, customClassName: false },
14
+ attributes: {
15
+ showExcerpt: { type: 'boolean', default: true },
16
+ showLocation: { type: 'boolean', default: true },
17
+ showSalary: { type: 'boolean', default: true },
18
+ showBenefits: { type: 'boolean', default: true },
19
+ showEmploymentType: { type: 'boolean', default: true },
20
+ },
21
+ edit: createCareerHeaderEdit(options),
22
+ save: () => null,
23
+ };
24
+ }
@@ -0,0 +1,2 @@
1
+ export declare const icon: import("react").JSX.Element;
2
+ //# sourceMappingURL=icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../../../src/blocks/career/career-header/icon.tsx"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,6BAOhB,CAAA"}
@@ -0,0 +1,2 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export const icon = (_jsxs("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [_jsx("rect", { x: "2", y: "3", width: "16", height: "4", rx: "1", stroke: "black", fill: "none" }), _jsx("line", { x1: "2", y1: "10", x2: "14", y2: "10", stroke: "black" }), _jsx("line", { x1: "2", y1: "13", x2: "18", y2: "13", stroke: "black" }), _jsx("line", { x1: "2", y1: "16", x2: "10", y2: "16", stroke: "black" })] }));
@@ -0,0 +1,5 @@
1
+ export type { CareerHeaderAttributes, CareerHeaderOptions } from './types';
2
+ export { createCareerHeaderBlock } from './factory';
3
+ import type { CareerHeaderOptions } from './types';
4
+ export declare const careerHeaderDefaults: CareerHeaderOptions;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/blocks/career/career-header/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAC,sBAAsB,EAAE,mBAAmB,EAAC,MAAM,SAAS,CAAA;AACxE,OAAO,EAAC,uBAAuB,EAAC,MAAM,WAAW,CAAA;AAEjD,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,SAAS,CAAA;AAEhD,eAAO,MAAM,oBAAoB,EAAE,mBAElC,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { createCareerHeaderBlock } from './factory';
2
+ export const careerHeaderDefaults = {
3
+ name: 'brilo/career-header',
4
+ };
@@ -0,0 +1,10 @@
1
+ import type { BriloBlockType } from '../../../types';
2
+ export interface CareerHeaderAttributes extends Record<string, unknown> {
3
+ showExcerpt: boolean;
4
+ showLocation: boolean;
5
+ showSalary: boolean;
6
+ showBenefits: boolean;
7
+ showEmploymentType: boolean;
8
+ }
9
+ export type CareerHeaderOptions = BriloBlockType;
10
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/blocks/career/career-header/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,SAAS,CAAA;AAE3C,MAAM,WAAW,sBAAuB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACrE,WAAW,EAAE,OAAO,CAAA;IACpB,YAAY,EAAE,OAAO,CAAA;IACrB,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,EAAE,OAAO,CAAA;IACrB,kBAAkB,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import type { SelectControlProps } from './types';
3
+ /**
4
+ * Manual job_position picker built on @wordpress/dataviews, mirroring
5
+ * DocumentsSelectModal closely (table view, search, sort, checkbox
6
+ * selection, reorderable selection list) but with just title/date columns.
7
+ */
8
+ export declare function JobPositionsSelectModal({ selectedItems, onChange }: SelectControlProps): React.JSX.Element;
9
+ //# sourceMappingURL=JobPositionsSelectModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobPositionsSelectModal.d.ts","sourceRoot":"","sources":["../../../../src/blocks/career/job-position-group/JobPositionsSelectModal.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAqC,MAAM,OAAO,CAAA;AACzD,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,SAAS,CAAA;AA0G/C;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,EAAC,aAAa,EAAE,QAAQ,EAAC,EAAE,kBAAkB,qBAuHpF"}
@@ -0,0 +1,123 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import apiFetch from '@wordpress/api-fetch';
3
+ import { Button, Card, CardBody, __experimentalHStack as HStack, Modal, __experimentalVStack as VStack } from '@wordpress/components';
4
+ import { DataViews } from '@wordpress/dataviews/wp';
5
+ import { __ } from '@wordpress/i18n';
6
+ import { arrowDown, arrowUp, close, plusCircle } from '@wordpress/icons';
7
+ // biome-ignore lint/correctness/noUnusedImports: required in scope for classic JSX transform
8
+ import { useEffect, useMemo, useState } from 'react';
9
+ const DEFAULT_VIEW = {
10
+ type: 'table',
11
+ search: '',
12
+ filters: [],
13
+ page: 1,
14
+ perPage: 20,
15
+ sort: { field: 'title', direction: 'asc' },
16
+ fields: ['date'],
17
+ titleField: 'title',
18
+ };
19
+ function useJobPositions() {
20
+ const [positions, setPositions] = useState([]);
21
+ const [isLoading, setIsLoading] = useState(true);
22
+ useEffect(() => {
23
+ setIsLoading(true);
24
+ apiFetch({
25
+ path: '/wp/v2/job_position?per_page=100&orderby=title&order=asc&_fields=id,title,date',
26
+ })
27
+ .then((result) => setPositions(result))
28
+ .catch(() => setPositions([]))
29
+ .finally(() => setIsLoading(false));
30
+ }, []);
31
+ return { positions, isLoading };
32
+ }
33
+ function SelectedOrderList({ items, onChange, onRemove, }) {
34
+ if (0 === items.length) {
35
+ return _jsx("p", { className: "i-job-position-select-modal__empty", children: __('Nevybrány žádné pozice.', 'brilo-blocks') });
36
+ }
37
+ const move = (index, direction) => {
38
+ const target = index + direction;
39
+ if (target < 0 || target >= items.length) {
40
+ return;
41
+ }
42
+ const next = [...items];
43
+ [next[index], next[target]] = [next[target], next[index]];
44
+ onChange(next.map((item) => item.id));
45
+ };
46
+ return (_jsx(VStack, { spacing: 2, children: items.map((item, index) => (_jsx(Card, { size: "small", className: "i-job-position-select-modal__item", children: _jsx(CardBody, { children: _jsxs(HStack, { alignment: "center", children: [_jsx("span", { className: "i-job-position-select-modal__item-title", style: {
47
+ flexGrow: 1,
48
+ minWidth: 0,
49
+ textAlign: 'left',
50
+ overflow: 'hidden',
51
+ textOverflow: 'ellipsis',
52
+ whiteSpace: 'nowrap',
53
+ }, children: item.title.rendered || __('(bez názvu)', 'brilo-blocks') }), _jsxs(HStack, { expanded: false, spacing: 1, children: [_jsx(Button, { size: "small", icon: arrowUp, label: __('Posunout výš', 'brilo-blocks'), onClick: () => move(index, -1), disabled: 0 === index }), _jsx(Button, { size: "small", icon: arrowDown, label: __('Posunout níž', 'brilo-blocks'), onClick: () => move(index, 1), disabled: index === items.length - 1 }), _jsx(Button, { size: "small", icon: close, isDestructive: true, label: __('Odebrat', 'brilo-blocks'), onClick: () => onRemove(item.id) })] })] }) }) }, item.id))) }));
54
+ }
55
+ /**
56
+ * Manual job_position picker built on @wordpress/dataviews, mirroring
57
+ * DocumentsSelectModal closely (table view, search, sort, checkbox
58
+ * selection, reorderable selection list) but with just title/date columns.
59
+ */
60
+ export function JobPositionsSelectModal({ selectedItems, onChange }) {
61
+ const { positions, isLoading } = useJobPositions();
62
+ const [isOpen, setIsOpen] = useState(false);
63
+ const [view, setView] = useState(DEFAULT_VIEW);
64
+ const selectedPositions = useMemo(() => selectedItems.map((id) => positions.find((pos) => pos.id === id)).filter((pos) => undefined !== pos), [selectedItems, positions]);
65
+ const fields = useMemo(() => [
66
+ {
67
+ id: 'title',
68
+ label: __('Název', 'brilo-blocks'),
69
+ enableHiding: false,
70
+ enableSorting: true,
71
+ render: ({ item }) => item.title.rendered || __('(bez názvu)', 'brilo-blocks'),
72
+ },
73
+ {
74
+ id: 'date',
75
+ label: __('Datum', 'brilo-blocks'),
76
+ enableSorting: true,
77
+ render: ({ item }) => (item.date ? new Date(item.date).toLocaleDateString() : '—'),
78
+ },
79
+ ], []);
80
+ const { data, paginationInfo } = useMemo(() => {
81
+ var _a;
82
+ var _b, _c;
83
+ let filtered = positions;
84
+ if (view.search) {
85
+ const needle = view.search.toLowerCase();
86
+ filtered = filtered.filter((pos) => pos.title.rendered.toLowerCase().includes(needle));
87
+ }
88
+ if ((_a = view.sort) === null || _a === void 0 ? void 0 : _a.field) {
89
+ const { field, direction } = view.sort;
90
+ const sorted = [...filtered];
91
+ sorted.sort((a, b) => {
92
+ var _a, _b;
93
+ const valueA = 'title' === field ? a.title.rendered : ((_a = a[field]) !== null && _a !== void 0 ? _a : '');
94
+ const valueB = 'title' === field ? b.title.rendered : ((_b = b[field]) !== null && _b !== void 0 ? _b : '');
95
+ const result = String(valueA).localeCompare(String(valueB));
96
+ return 'desc' === direction ? -result : result;
97
+ });
98
+ filtered = sorted;
99
+ }
100
+ const perPage = (_b = view.perPage) !== null && _b !== void 0 ? _b : 20;
101
+ const page = (_c = view.page) !== null && _c !== void 0 ? _c : 1;
102
+ const start = (page - 1) * perPage;
103
+ return {
104
+ data: filtered.slice(start, start + perPage),
105
+ paginationInfo: { totalItems: filtered.length, totalPages: Math.ceil(filtered.length / perPage) || 1 },
106
+ };
107
+ }, [positions, view]);
108
+ const toggleSelected = (id) => {
109
+ onChange(selectedItems.includes(id) ? selectedItems.filter((itemId) => itemId !== id) : [...selectedItems, id]);
110
+ };
111
+ return (_jsxs(VStack, { spacing: 3, className: "i-job-position-select-modal", children: [_jsx(Button, { variant: "secondary", icon: plusCircle, onClick: () => setIsOpen(true), children: __('Vybrat pozice', 'brilo-blocks') }), _jsx(SelectedOrderList, { items: selectedPositions, onChange: onChange, onRemove: (id) => onChange(selectedItems.filter((itemId) => itemId !== id)) }), isOpen && (_jsx(Modal, { title: __('Vybrat pozice', 'brilo-blocks'), onRequestClose: () => setIsOpen(false), size: "fill", children: _jsxs(VStack, { spacing: 4, style: { height: '100%' }, children: [_jsx("div", { style: { flexGrow: 1, minHeight: 0 }, children: _jsx(DataViews, { data: data, fields: fields, view: view, onChangeView: setView, paginationInfo: paginationInfo, isLoading: isLoading, defaultLayouts: { table: {} }, getItemId: (item) => String(item.id), selection: selectedItems.map(String), onChangeSelection: (ids) => onChange(ids.map(Number)), actions: [
112
+ {
113
+ id: 'toggle',
114
+ label: (items) => items.length && selectedItems.includes(items[0].id) ? __('Odebrat', 'brilo-blocks') : __('Přidat', 'brilo-blocks'),
115
+ supportsBulk: true,
116
+ callback: (items) => {
117
+ items.forEach((item) => {
118
+ toggleSelected(item.id);
119
+ });
120
+ },
121
+ },
122
+ ] }) }), _jsx(HStack, { justify: "flex-end", children: _jsx(Button, { variant: "primary", onClick: () => setIsOpen(false), children: __('Hotovo', 'brilo-blocks') }) })] }) }))] }));
123
+ }
@@ -0,0 +1,10 @@
1
+ export declare const JOB_POSITION_GROUP_MODES: readonly ['selected', 'listing'];
2
+ export declare const JOB_POSITION_GROUP_SORT_BYS: readonly ['date', 'title', 'start_date', 'menu_order'];
3
+ export declare const JOB_POSITION_GROUP_SORT_ORDERS: readonly ['asc', 'desc'];
4
+ export declare const JOB_POSITION_GROUP_MODE: "selected";
5
+ export declare const JOB_POSITION_GROUP_SORT_BY: "date";
6
+ export declare const JOB_POSITION_GROUP_SORT_ORDER: "desc";
7
+ export declare const JOB_POSITION_GROUP_PER_PAGE_MIN = 1;
8
+ export declare const JOB_POSITION_GROUP_PER_PAGE_MAX = 24;
9
+ export declare const JOB_POSITION_GROUP_PER_PAGE = 6;
10
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/blocks/career/job-position-group/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,YAAI,UAAU,EAAE,SAAS,CAAU,CAAA;AACxE,eAAO,MAAM,2BAA2B,YAAI,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,CAAU,CAAA;AACjG,eAAO,MAAM,8BAA8B,YAAI,KAAK,EAAE,MAAM,CAAU,CAAA;AAEtE,eAAO,MAAM,uBAAuB,YAA8B,CAAA;AAClE,eAAO,MAAM,0BAA0B,QAAiC,CAAA;AACxE,eAAO,MAAM,6BAA6B,QAAoC,CAAA;AAE9E,eAAO,MAAM,+BAA+B,IAAI,CAAA;AAChD,eAAO,MAAM,+BAA+B,KAAK,CAAA;AACjD,eAAO,MAAM,2BAA2B,IAAI,CAAA"}
@@ -0,0 +1,9 @@
1
+ export const JOB_POSITION_GROUP_MODES = ['selected', 'listing'];
2
+ export const JOB_POSITION_GROUP_SORT_BYS = ['date', 'title', 'start_date', 'menu_order'];
3
+ export const JOB_POSITION_GROUP_SORT_ORDERS = ['asc', 'desc'];
4
+ export const JOB_POSITION_GROUP_MODE = JOB_POSITION_GROUP_MODES[0];
5
+ export const JOB_POSITION_GROUP_SORT_BY = JOB_POSITION_GROUP_SORT_BYS[0];
6
+ export const JOB_POSITION_GROUP_SORT_ORDER = JOB_POSITION_GROUP_SORT_ORDERS[1];
7
+ export const JOB_POSITION_GROUP_PER_PAGE_MIN = 1;
8
+ export const JOB_POSITION_GROUP_PER_PAGE_MAX = 24;
9
+ export const JOB_POSITION_GROUP_PER_PAGE = 6;
@@ -0,0 +1,6 @@
1
+ import type { JobPositionGroupAttributes, JobPositionGroupOptions } from './types';
2
+ export declare function createJobPositionGroupEdit(options: JobPositionGroupOptions): ({ attributes, setAttributes, }: {
3
+ attributes: JobPositionGroupAttributes;
4
+ setAttributes: (a: Partial<JobPositionGroupAttributes>) => void;
5
+ }) => import("react").JSX.Element;
6
+ //# sourceMappingURL=edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../../src/blocks/career/job-position-group/edit.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAC,0BAA0B,EAAE,uBAAuB,EAAC,MAAM,SAAS,CAAA;AAEhF,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,uBAAuB,oCAItE;IACD,UAAU,EAAE,0BAA0B,CAAA;IACtC,aAAa,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,KAAK,IAAI,CAAA;CAChE,iCA0EF"}
@@ -0,0 +1,17 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { InspectorControls, useBlockProps } from '@wordpress/block-editor';
3
+ import { PanelBody, RangeControl, __experimentalToggleGroupControl as ToggleGroupControl, __experimentalToggleGroupControlOption as ToggleGroupControlOption, } from '@wordpress/components';
4
+ import { __ } from '@wordpress/i18n';
5
+ import { JOB_POSITION_GROUP_PER_PAGE, JOB_POSITION_GROUP_PER_PAGE_MAX, JOB_POSITION_GROUP_PER_PAGE_MIN } from './constants';
6
+ export function createJobPositionGroupEdit(options) {
7
+ return function Edit({ attributes, setAttributes, }) {
8
+ var _a;
9
+ const { mode, selectedPositions, perPage, sortBy, sortOrder } = attributes;
10
+ const blockProps = useBlockProps({ className: 'wp-block-section' });
11
+ return (_jsxs(_Fragment, { children: [_jsx(InspectorControls, { children: _jsxs(PanelBody, { title: __('Nastavení výpisu', 'brilo-blocks'), initialOpen: true, children: [_jsxs(ToggleGroupControl, { label: __('Zdroj pozic', 'brilo-blocks'), value: mode, onChange: (value) => setAttributes({ mode: value }), isBlock: true, children: [_jsx(ToggleGroupControlOption, { value: "selected", label: __('Vybrané', 'brilo-blocks') }), _jsx(ToggleGroupControlOption, { value: "listing", label: __('Výpis', 'brilo-blocks') })] }), 'listing' === mode && (_jsxs(_Fragment, { children: [_jsx(RangeControl, { label: __('Počet pozic', 'brilo-blocks'), value: perPage, onChange: (value) => setAttributes({ perPage: value !== null && value !== void 0 ? value : JOB_POSITION_GROUP_PER_PAGE }), min: JOB_POSITION_GROUP_PER_PAGE_MIN, max: JOB_POSITION_GROUP_PER_PAGE_MAX }), _jsxs(ToggleGroupControl, { label: __('Řazení', 'brilo-blocks'), value: sortBy, onChange: (value) => setAttributes({ sortBy: value }), isBlock: true, children: [_jsx(ToggleGroupControlOption, { value: "date", label: __('Datum publikace', 'brilo-blocks') }), _jsx(ToggleGroupControlOption, { value: "title", label: __('Název', 'brilo-blocks') }), _jsx(ToggleGroupControlOption, { value: "start_date", label: __('Datum nástupu', 'brilo-blocks') }), _jsx(ToggleGroupControlOption, { value: "menu_order", label: __('Pořadí', 'brilo-blocks') })] }), _jsxs(ToggleGroupControl, { label: __('Směr řazení', 'brilo-blocks'), value: sortOrder, onChange: (value) => setAttributes({ sortOrder: value }), isBlock: true, children: [_jsx(ToggleGroupControlOption, { value: "desc", label: __('Sestupně', 'brilo-blocks') }), _jsx(ToggleGroupControlOption, { value: "asc", label: __('Vzestupně', 'brilo-blocks') })] })] }))] }) }), _jsxs("div", { ...blockProps, children: ['selected' === mode &&
12
+ ((_a = options.renderPositionsControl) === null || _a === void 0 ? void 0 : _a.call(options, {
13
+ selectedItems: selectedPositions,
14
+ onChange: (ids) => setAttributes({ selectedPositions: ids }),
15
+ })), 'listing' === mode && (_jsxs("div", { className: "components-placeholder", children: [_jsx("div", { className: "components-placeholder__label", children: __('Pracovní pozice', 'brilo-blocks') }), _jsx("div", { className: "components-placeholder__instructions", children: `${__('Zobrazí', 'brilo-blocks')} ${perPage} ${__('pracovních pozic.', 'brilo-blocks')}` })] }))] })] }));
16
+ };
17
+ }
@@ -0,0 +1,5 @@
1
+ import type { BlockConfiguration } from '@wordpress/blocks';
2
+ import type { JobPositionGroupAttributes, JobPositionGroupOptions } from './types';
3
+ export type { JobPositionGroupAttributes, JobPositionGroupOptions };
4
+ export declare function createJobPositionGroupBlock(options: JobPositionGroupOptions): BlockConfiguration<JobPositionGroupAttributes>;
5
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../../src/blocks/career/job-position-group/factory.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,mBAAmB,CAAA;AAazD,OAAO,KAAK,EAAC,0BAA0B,EAAE,uBAAuB,EAAC,MAAM,SAAS,CAAA;AAEhF,YAAY,EAAC,0BAA0B,EAAE,uBAAuB,EAAC,CAAA;AAEjE,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,uBAAuB,GAAG,kBAAkB,CAAC,0BAA0B,CAAC,CAsC5H"}
@@ -0,0 +1,44 @@
1
+ import { __ } from '@wordpress/i18n';
2
+ import { JOB_POSITION_GROUP_MODE, JOB_POSITION_GROUP_MODES, JOB_POSITION_GROUP_PER_PAGE, JOB_POSITION_GROUP_SORT_BY, JOB_POSITION_GROUP_SORT_BYS, JOB_POSITION_GROUP_SORT_ORDER, JOB_POSITION_GROUP_SORT_ORDERS, } from './constants';
3
+ import { createJobPositionGroupEdit } from './edit';
4
+ import { icon as defaultIcon } from './icon';
5
+ export function createJobPositionGroupBlock(options) {
6
+ var _a, _b, _c;
7
+ return {
8
+ name: options.name,
9
+ title: (_a = options.title) !== null && _a !== void 0 ? _a : __('Pracovní pozice', 'brilo-blocks'),
10
+ description: options.description,
11
+ category: (_b = options.category) !== null && _b !== void 0 ? _b : 'widgets',
12
+ ...(options.parent && { parent: options.parent }),
13
+ icon: (_c = options.icon) !== null && _c !== void 0 ? _c : { src: defaultIcon },
14
+ supports: { html: false, customClassName: false },
15
+ attributes: {
16
+ mode: {
17
+ type: 'string',
18
+ default: JOB_POSITION_GROUP_MODE,
19
+ enum: [...JOB_POSITION_GROUP_MODES],
20
+ },
21
+ selectedPositions: {
22
+ type: 'array',
23
+ default: [],
24
+ items: { type: 'number' },
25
+ },
26
+ perPage: {
27
+ type: 'number',
28
+ default: JOB_POSITION_GROUP_PER_PAGE,
29
+ },
30
+ sortBy: {
31
+ type: 'string',
32
+ default: JOB_POSITION_GROUP_SORT_BY,
33
+ enum: [...JOB_POSITION_GROUP_SORT_BYS],
34
+ },
35
+ sortOrder: {
36
+ type: 'string',
37
+ default: JOB_POSITION_GROUP_SORT_ORDER,
38
+ enum: [...JOB_POSITION_GROUP_SORT_ORDERS],
39
+ },
40
+ },
41
+ edit: createJobPositionGroupEdit(options),
42
+ save: () => null,
43
+ };
44
+ }
@@ -0,0 +1,2 @@
1
+ export declare const icon: import("react").JSX.Element;
2
+ //# sourceMappingURL=icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../../../src/blocks/career/job-position-group/icon.tsx"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,6BAMhB,CAAA"}
@@ -0,0 +1,2 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export const icon = (_jsxs("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [_jsx("rect", { x: "2", y: "6", width: "16", height: "11", rx: "1", stroke: "black", fill: "none" }), _jsx("path", { d: "M7 6V4C7 3.44772 7.44772 3 8 3H12C12.5523 3 13 3.44772 13 4V6", stroke: "black", fill: "none" }), _jsx("line", { x1: "2", y1: "11", x2: "18", y2: "11", stroke: "black" })] }));
@@ -0,0 +1,6 @@
1
+ export type { JobPositionGroupAttributes, JobPositionGroupOptions, JobPositionGroupMode, JobPositionGroupSortBy, JobPositionGroupSortOrder, } from './types';
2
+ export { createJobPositionGroupBlock } from './factory';
3
+ export { JobPositionsSelectModal } from './JobPositionsSelectModal';
4
+ import type { JobPositionGroupOptions } from './types';
5
+ export declare const jobPositionGroupDefaults: JobPositionGroupOptions;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/blocks/career/job-position-group/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,0BAA0B,EAC1B,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,SAAS,CAAA;AAChB,OAAO,EAAC,2BAA2B,EAAC,MAAM,WAAW,CAAA;AACrD,OAAO,EAAC,uBAAuB,EAAC,MAAM,2BAA2B,CAAA;AAEjE,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,SAAS,CAAA;AAEpD,eAAO,MAAM,wBAAwB,EAAE,uBAEtC,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { createJobPositionGroupBlock } from './factory';
2
+ export { JobPositionsSelectModal } from './JobPositionsSelectModal';
3
+ export const jobPositionGroupDefaults = {
4
+ name: 'brilo/job-position-group',
5
+ };
@@ -0,0 +1,20 @@
1
+ import type { BriloBlockType } from '../../../types';
2
+ import type { JOB_POSITION_GROUP_MODES, JOB_POSITION_GROUP_SORT_BYS, JOB_POSITION_GROUP_SORT_ORDERS } from './constants';
3
+ export type JobPositionGroupMode = (typeof JOB_POSITION_GROUP_MODES)[number];
4
+ export type JobPositionGroupSortBy = (typeof JOB_POSITION_GROUP_SORT_BYS)[number];
5
+ export type JobPositionGroupSortOrder = (typeof JOB_POSITION_GROUP_SORT_ORDERS)[number];
6
+ export interface JobPositionGroupAttributes extends Record<string, unknown> {
7
+ mode: JobPositionGroupMode;
8
+ selectedPositions: number[];
9
+ perPage: number;
10
+ sortBy: JobPositionGroupSortBy;
11
+ sortOrder: JobPositionGroupSortOrder;
12
+ }
13
+ export interface SelectControlProps {
14
+ selectedItems: number[];
15
+ onChange: (ids: number[]) => void;
16
+ }
17
+ export interface JobPositionGroupOptions extends BriloBlockType {
18
+ renderPositionsControl?: (props: SelectControlProps) => JSX.Element;
19
+ }
20
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/blocks/career/job-position-group/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,SAAS,CAAA;AAC3C,OAAO,KAAK,EAAC,wBAAwB,EAAE,2BAA2B,EAAE,8BAA8B,EAAC,MAAM,aAAa,CAAA;AAEtH,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAA;AAC5E,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,2BAA2B,CAAC,CAAC,MAAM,CAAC,CAAA;AACjF,MAAM,MAAM,yBAAyB,GAAG,CAAC,OAAO,8BAA8B,CAAC,CAAC,MAAM,CAAC,CAAA;AAEvF,MAAM,WAAW,0BAA2B,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACzE,IAAI,EAAE,oBAAoB,CAAA;IAC1B,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,sBAAsB,CAAA;IAC9B,SAAS,EAAE,yBAAyB,CAAA;CACrC;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;CAClC;AAED,MAAM,WAAW,uBAAwB,SAAQ,cAAc;IAC7D,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,GAAG,CAAC,OAAO,CAAA;CACpE"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import type { SelectControlProps } from './types';
3
+ /**
4
+ * Manual document picker built on the real @wordpress/dataviews package: a
5
+ * fill-size modal (table view, search, sort, checkbox selection) for
6
+ * browsing/selecting documents, plus an up/down-reorderable list of the
7
+ * current selection below (drag-and-drop conflicted with the block editor's
8
+ * own native block dragging — see git history). Local to this block — not a
9
+ * shared @brilo/gutenberg-toolkit component.
10
+ */
11
+ export declare function DocumentsSelectModal({ selectedItems, onChange }: SelectControlProps): React.JSX.Element;
12
+ //# sourceMappingURL=DocumentsSelectModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentsSelectModal.d.ts","sourceRoot":"","sources":["../../../../src/blocks/document/documents-group/DocumentsSelectModal.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAqC,MAAM,OAAO,CAAA;AACzD,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,SAAS,CAAA;AAgH/C;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,EAAC,aAAa,EAAE,QAAQ,EAAC,EAAE,kBAAkB,qBAiJjF"}
@@ -0,0 +1,153 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import apiFetch from '@wordpress/api-fetch';
3
+ import { Button, Card, CardBody, __experimentalHStack as HStack, Modal, __experimentalVStack as VStack } from '@wordpress/components';
4
+ import { DataViews } from '@wordpress/dataviews/wp';
5
+ import { __ } from '@wordpress/i18n';
6
+ import { arrowDown, arrowUp, close, plusCircle } from '@wordpress/icons';
7
+ // biome-ignore lint/correctness/noUnusedImports: required in scope for classic JSX transform
8
+ import { useEffect, useMemo, useState } from 'react';
9
+ const DEFAULT_VIEW = {
10
+ type: 'table',
11
+ search: '',
12
+ filters: [],
13
+ page: 1,
14
+ perPage: 20,
15
+ sort: { field: 'title', direction: 'asc' },
16
+ fields: ['document_file_display', 'document_category_names', 'document_alt_title', 'document_url'],
17
+ titleField: 'title',
18
+ };
19
+ function useDocuments() {
20
+ const [documents, setDocuments] = useState([]);
21
+ const [isLoading, setIsLoading] = useState(true);
22
+ useEffect(() => {
23
+ setIsLoading(true);
24
+ apiFetch({
25
+ path: '/wp/v2/document?per_page=100&orderby=title&order=asc&' +
26
+ '_fields=id,title,date,document_alt_title,document_url,document_file_display,document_category_names',
27
+ })
28
+ .then((result) => setDocuments(result))
29
+ .catch(() => setDocuments([]))
30
+ .finally(() => setIsLoading(false));
31
+ }, []);
32
+ return { documents, isLoading };
33
+ }
34
+ function SelectedOrderList({ items, onChange, onRemove, }) {
35
+ if (0 === items.length) {
36
+ return _jsx("p", { className: "i-documents-select-modal__empty", children: __('Nevybrány žádné dokumenty.', 'brilo-blocks') });
37
+ }
38
+ const move = (index, direction) => {
39
+ const target = index + direction;
40
+ if (target < 0 || target >= items.length) {
41
+ return;
42
+ }
43
+ const next = [...items];
44
+ [next[index], next[target]] = [next[target], next[index]];
45
+ onChange(next.map((item) => item.id));
46
+ };
47
+ return (_jsx(VStack, { spacing: 2, children: items.map((item, index) => (_jsx(Card, { size: "small", className: "i-documents-select-modal__item", children: _jsx(CardBody, { children: _jsxs(HStack, { alignment: "center", children: [_jsx("span", { className: "i-documents-select-modal__item-title", style: {
48
+ flexGrow: 1,
49
+ minWidth: 0,
50
+ textAlign: 'left',
51
+ overflow: 'hidden',
52
+ textOverflow: 'ellipsis',
53
+ whiteSpace: 'nowrap',
54
+ }, children: item.title.rendered || __('(bez názvu)', 'brilo-blocks') }), _jsxs(HStack, { expanded: false, spacing: 1, children: [_jsx(Button, { size: "small", icon: arrowUp, label: __('Posunout výš', 'brilo-blocks'), onClick: () => move(index, -1), disabled: 0 === index }), _jsx(Button, { size: "small", icon: arrowDown, label: __('Posunout níž', 'brilo-blocks'), onClick: () => move(index, 1), disabled: index === items.length - 1 }), _jsx(Button, { size: "small", icon: close, isDestructive: true, label: __('Odebrat', 'brilo-blocks'), onClick: () => onRemove(item.id) })] })] }) }) }, item.id))) }));
55
+ }
56
+ /**
57
+ * Manual document picker built on the real @wordpress/dataviews package: a
58
+ * fill-size modal (table view, search, sort, checkbox selection) for
59
+ * browsing/selecting documents, plus an up/down-reorderable list of the
60
+ * current selection below (drag-and-drop conflicted with the block editor's
61
+ * own native block dragging — see git history). Local to this block — not a
62
+ * shared @brilo/gutenberg-toolkit component.
63
+ */
64
+ export function DocumentsSelectModal({ selectedItems, onChange }) {
65
+ const { documents, isLoading } = useDocuments();
66
+ const [isOpen, setIsOpen] = useState(false);
67
+ const [view, setView] = useState(DEFAULT_VIEW);
68
+ const selectedDocuments = useMemo(() => selectedItems.map((id) => documents.find((doc) => doc.id === id)).filter((doc) => undefined !== doc), [selectedItems, documents]);
69
+ const fields = useMemo(() => [
70
+ {
71
+ id: 'title',
72
+ label: __('Název', 'brilo-blocks'),
73
+ enableHiding: false,
74
+ enableSorting: true,
75
+ render: ({ item }) => item.title.rendered || __('(bez názvu)', 'brilo-blocks'),
76
+ },
77
+ {
78
+ id: 'document_file_display',
79
+ label: __('Soubor', 'brilo-blocks'),
80
+ enableSorting: false,
81
+ render: ({ item }) => item.document_file_display || '—',
82
+ },
83
+ {
84
+ id: 'document_category_names',
85
+ label: __('Kategorie', 'brilo-blocks'),
86
+ enableSorting: false,
87
+ render: ({ item }) => item.document_category_names || '—',
88
+ },
89
+ {
90
+ id: 'document_alt_title',
91
+ label: __('Alternativní titulek', 'brilo-blocks'),
92
+ enableSorting: false,
93
+ render: ({ item }) => item.document_alt_title || '—',
94
+ },
95
+ {
96
+ id: 'document_url',
97
+ label: __('Alternativní URL', 'brilo-blocks'),
98
+ enableSorting: false,
99
+ render: ({ item }) => item.document_url || '—',
100
+ },
101
+ {
102
+ id: 'date',
103
+ label: __('Datum', 'brilo-blocks'),
104
+ enableSorting: true,
105
+ render: ({ item }) => (item.date ? new Date(item.date).toLocaleDateString() : '—'),
106
+ },
107
+ ], []);
108
+ const { data, paginationInfo } = useMemo(() => {
109
+ var _a;
110
+ var _b, _c;
111
+ let filtered = documents;
112
+ if (view.search) {
113
+ const needle = view.search.toLowerCase();
114
+ filtered = filtered.filter((doc) => doc.title.rendered.toLowerCase().includes(needle));
115
+ }
116
+ if ((_a = view.sort) === null || _a === void 0 ? void 0 : _a.field) {
117
+ const { field, direction } = view.sort;
118
+ const sorted = [...filtered];
119
+ sorted.sort((a, b) => {
120
+ var _a, _b;
121
+ const valueA = 'title' === field ? a.title.rendered : ((_a = a[field]) !== null && _a !== void 0 ? _a : '');
122
+ const valueB = 'title' === field ? b.title.rendered : ((_b = b[field]) !== null && _b !== void 0 ? _b : '');
123
+ const result = String(valueA).localeCompare(String(valueB));
124
+ return 'desc' === direction ? -result : result;
125
+ });
126
+ filtered = sorted;
127
+ }
128
+ const perPage = (_b = view.perPage) !== null && _b !== void 0 ? _b : 20;
129
+ const page = (_c = view.page) !== null && _c !== void 0 ? _c : 1;
130
+ const start = (page - 1) * perPage;
131
+ return {
132
+ data: filtered.slice(start, start + perPage),
133
+ paginationInfo: { totalItems: filtered.length, totalPages: Math.ceil(filtered.length / perPage) || 1 },
134
+ };
135
+ }, [documents, view]);
136
+ const toggleSelected = (id) => {
137
+ onChange(selectedItems.includes(id) ? selectedItems.filter((itemId) => itemId !== id) : [...selectedItems, id]);
138
+ };
139
+ return (_jsxs(VStack, { spacing: 3, className: "i-documents-select-modal", children: [_jsx(Button, { variant: "secondary", icon: plusCircle, onClick: () => setIsOpen(true), children: __('Vybrat dokumenty', 'brilo-blocks') }), _jsx(SelectedOrderList, { items: selectedDocuments, onChange: onChange, onRemove: (id) => onChange(selectedItems.filter((itemId) => itemId !== id)) }), isOpen && (_jsx(Modal, { title: __('Vybrat dokumenty', 'brilo-blocks'), onRequestClose: () => setIsOpen(false), size: "fill", children: _jsxs(VStack, { spacing: 4, style: { height: '100%' }, children: [_jsx("div", { style: { flexGrow: 1, minHeight: 0 }, children: _jsx(DataViews, { data: data, fields: fields, view: view, onChangeView: setView, paginationInfo: paginationInfo, isLoading: isLoading, defaultLayouts: { table: {} }, getItemId: (item) => String(item.id), selection: selectedItems.map(String), onChangeSelection: (ids) => onChange(ids.map(Number)), actions: [
140
+ {
141
+ id: 'toggle',
142
+ label: (items) => items.length && selectedItems.includes(items[0].id) ? __('Odebrat', 'brilo-blocks') : __('Přidat', 'brilo-blocks'),
143
+ // supportsBulk is what makes DataViews render a checkbox per row —
144
+ // without it there's no way to select items other than this menu.
145
+ supportsBulk: true,
146
+ callback: (items) => {
147
+ items.forEach((item) => {
148
+ toggleSelected(item.id);
149
+ });
150
+ },
151
+ },
152
+ ] }) }), _jsx(HStack, { justify: "flex-end", children: _jsx(Button, { variant: "primary", onClick: () => setIsOpen(false), children: __('Hotovo', 'brilo-blocks') }) })] }) }))] }));
153
+ }
@@ -0,0 +1,7 @@
1
+ import type { DocumentsGroupColumns, DocumentsGroupMode, DocumentsGroupListingStyle, DocumentsGroupSortBy } from './types';
2
+ export declare const DOCUMENTS_GROUP_MODE_DEFAULT: DocumentsGroupMode;
3
+ export declare const DOCUMENTS_GROUP_LISTING_STYLE_DEFAULT: DocumentsGroupListingStyle;
4
+ export declare const DOCUMENTS_GROUP_SORT_BY_DEFAULT: DocumentsGroupSortBy;
5
+ export declare const DOCUMENTS_GROUP_COLUMNS_DEFAULT: DocumentsGroupColumns;
6
+ export declare const DOCUMENTS_GROUP_COLUMNS: DocumentsGroupColumns[];
7
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/blocks/document/documents-group/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,qBAAqB,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,oBAAoB,EAAC,MAAM,SAAS,CAAA;AAExH,eAAO,MAAM,4BAA4B,EAAE,kBAA6B,CAAA;AACxE,eAAO,MAAM,qCAAqC,EAAE,0BAAsC,CAAA;AAC1F,eAAO,MAAM,+BAA+B,EAAE,oBAAqC,CAAA;AACnF,eAAO,MAAM,+BAA+B,EAAE,qBAAyB,CAAA;AACvE,eAAO,MAAM,uBAAuB,EAAE,qBAAqB,EAAoB,CAAA"}