@kids-reporter/draft-editor 0.1.0
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/README.md +51 -0
- package/lib/.selector/align-selector.js +71 -0
- package/lib/.selector/audio-selector.js +268 -0
- package/lib/.selector/image-selector.js +430 -0
- package/lib/.selector/pagination.js +82 -0
- package/lib/.selector/post-selector.js +311 -0
- package/lib/.selector/search-box.js +46 -0
- package/lib/.selector/video-selector.js +285 -0
- package/lib/block-renderer/background-image-block.js +141 -0
- package/lib/block-renderer/background-video-block.js +151 -0
- package/lib/block-renderer/color-box-block.js +86 -0
- package/lib/block-renderer/info-box-block.js +86 -0
- package/lib/block-renderer/side-index-block.js +90 -0
- package/lib/block-renderer/table-block.js +408 -0
- package/lib/block-renderer-fn.js +131 -0
- package/lib/buttons/annotation.js +117 -0
- package/lib/buttons/audio.js +65 -0
- package/lib/buttons/background-color.js +122 -0
- package/lib/buttons/background-image.js +223 -0
- package/lib/buttons/background-video.js +223 -0
- package/lib/buttons/color-box.js +173 -0
- package/lib/buttons/divider.js +63 -0
- package/lib/buttons/embedded-code.js +109 -0
- package/lib/buttons/enlarge.js +24 -0
- package/lib/buttons/font-color.js +115 -0
- package/lib/buttons/image.js +70 -0
- package/lib/buttons/info-box.js +148 -0
- package/lib/buttons/link.js +107 -0
- package/lib/buttons/media.js +121 -0
- package/lib/buttons/related-post.js +71 -0
- package/lib/buttons/selector/align-selector.js +71 -0
- package/lib/buttons/selector/audio-selector.js +279 -0
- package/lib/buttons/selector/image-selector.js +417 -0
- package/lib/buttons/selector/pagination.js +82 -0
- package/lib/buttons/selector/post-selector.js +317 -0
- package/lib/buttons/selector/search-box.js +46 -0
- package/lib/buttons/selector/video-selector.js +281 -0
- package/lib/buttons/side-index.js +200 -0
- package/lib/buttons/slideshow.js +71 -0
- package/lib/buttons/table.js +67 -0
- package/lib/buttons/text-align.js +88 -0
- package/lib/buttons/video.js +65 -0
- package/lib/buttons/youtube.js +147 -0
- package/lib/const.js +18 -0
- package/lib/draft-converter/api-data-instance.js +58 -0
- package/lib/draft-converter/atomic-block-processor.js +233 -0
- package/lib/draft-converter/entities.js +76 -0
- package/lib/draft-converter/index.js +201 -0
- package/lib/draft-converter/inline-styles-processor.js +236 -0
- package/lib/draft-editor.js +918 -0
- package/lib/entity-decorator.js +20 -0
- package/lib/index.js +15 -0
- package/lib/modifier.js +68 -0
- package/lib/theme/index.js +39 -0
- package/package.json +41 -0
package/README.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# [@mirrormedia/lilith-core](https://www.npmjs.com/package/@mirrormedia/lilith-draft-editor) · 
|
|
2
|
+
|
|
3
|
+
### Installation
|
|
4
|
+
|
|
5
|
+
`yarn install`
|
|
6
|
+
|
|
7
|
+
### Development
|
|
8
|
+
|
|
9
|
+
`@mirrormedia/lilith-draft-editor` export `@mirrormedia/lilith-core` 所需要的 `RichTextEditor`,而 `@mirrormedia/lilith-core` 則是被 `@mirrormedia/lilith-(mirrormedia|readr|mesh|editools)` 所使用,因此在開發上會以各網站的角度去切入,在本套件中修改 editor 相關的程式碼,並在 lilith-(mirrormedia|readr|mesh|editools) 中測試開發狀況。
|
|
10
|
+
|
|
11
|
+
舉 lilith-mirrormedia 為例,要修改 mirrormedia 相關的 RichTextEditor 需要在 `packages/lilith-draft-editor` 中進行改動,改動完之後跑 `yarn build` 產生 transpiled 後的程式碼,若 `packages/lilith-draft-editor` 有修改 package.json 中的套件版本時,則需要同時修改 `packages/core` 中 import `@mirrormedia/lilith-draft-editor` 的版本; 同理,若是因此 `packages/core` 有修改版本號的話也需要跑 `yarn build`, `packages/mirrormedia` 也同樣需要修改 import `@mirrormedia/lilith-core` 的版本。
|
|
12
|
+
|
|
13
|
+
因為 lilith-mirrormedia, lilith-core, lilith-draft-editor 都在 monorepo 中,yarn workspaces 會為 lilith-core, lilith-draft-editor pkg 建立 soft link,將 `node_modules/@mirrormedia/lilith-core` 指到 `packages/core` 而 `node_modules/@mirrormedia/lilith-draft-editor` 指到 `packages/draft-editor`,所以 `yarn build` 產生的新的程式碼,可以不需要透過 npm publish 和 yarn install 的方式,立即讓 lilith-mirrormedia, lilith-core 使用。
|
|
14
|
+
|
|
15
|
+
等到確定程式碼修改完畢後,我們再將最新的程式碼上傳(`npm publish`)到 npm registry 去,讓 lilith-editools 的 CI/CD 可以下載到最新的版本。
|
|
16
|
+
|
|
17
|
+
### File Structure
|
|
18
|
+
|
|
19
|
+
在 `src` 資料夾下有兩大類的檔案
|
|
20
|
+
|
|
21
|
+
1. 共用的 draft.js 程式碼: 主要是 draft.js button UI, draft-converter 和其他 helper function
|
|
22
|
+
2. 各網站客製化的改動:
|
|
23
|
+
|
|
24
|
+
依照各網站需求修改`src/website/${website}/`中的檔案
|
|
25
|
+
|
|
26
|
+
- block-renderer : 在既有(注 1)的 block-renderer 上附加可編輯的 wrapper,僅有部分 block renderers 適用
|
|
27
|
+
- selector: 依照各網站 keystone list 來調整 photo, video 和 post 的 gql query
|
|
28
|
+
- draft-editor: 主要 export 出 RichTextEditor 的檔案,實際使用在 lilith-core 對應的 webiste 中,可直接決定 RichTextEditor 樣式(注 2)
|
|
29
|
+
|
|
30
|
+
\*注 1: lilith-draft-editor 各個 buttons 對應的 block-renderers, entity-decorators 會 maintain 在 lilith-draft-renderer,由各網站 Next.js 專案開發人員實作,在本專案中會直接將 lilith-draft-renderer 中定義好的 block-renderers, entity-decorators 直接使用(除了少數需要再編輯的 block-renderer,參考 `src/website/${website}/block-renderer`中的 editor wrapper component)。
|
|
31
|
+
|
|
32
|
+
\*注 2: 雖然各個網站都 maintain 了一個 draft-editor,可以自行決定 import 進來的 buttons,不過因為 lilith-core 中實作 disalbedButtons 的功能,所以目前一率將所有的 buttons 加入 RichTextEditor 中,由 lilith-(mirrormedia|readr|mesh|editools) 來控制所使用的 buttons。
|
|
33
|
+
|
|
34
|
+
### Build
|
|
35
|
+
|
|
36
|
+
`yarn build`
|
|
37
|
+
|
|
38
|
+
### Publish
|
|
39
|
+
|
|
40
|
+
`npm run publish`
|
|
41
|
+
|
|
42
|
+
在 publish 前,請根據 conventional commits 的規範,將 package.json#version 升版。
|
|
43
|
+
|
|
44
|
+
### Notable Details
|
|
45
|
+
|
|
46
|
+
#### For those files under `views/` folder, we transpile them specifically.
|
|
47
|
+
|
|
48
|
+
For those files under `views/` folder, we transpile them by babel according to different configuation.
|
|
49
|
+
The specific babel configuration is `.views.babelrc.js`.
|
|
50
|
+
In `.views.babelrc.js`, we tell babel not to transpile `import` and `export` es6 codes into commonJS codes.
|
|
51
|
+
The Keystone server won't start server well if those files under `views/` are transpiled into commonJS codes.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.AlignSelector = AlignSelector;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
11
|
+
|
|
12
|
+
var _fields = require("@keystone-ui/fields");
|
|
13
|
+
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
|
|
16
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
17
|
+
|
|
18
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
19
|
+
|
|
20
|
+
const Label = _styledComponents.default.label`
|
|
21
|
+
display: block;
|
|
22
|
+
margin: 10px 0;
|
|
23
|
+
font-weight: 600;
|
|
24
|
+
`;
|
|
25
|
+
const AlignSelect = (0, _styledComponents.default)(_fields.Select)`
|
|
26
|
+
${({
|
|
27
|
+
menuHeight
|
|
28
|
+
}) => {
|
|
29
|
+
return `margin-bottom: ${menuHeight}px;`;
|
|
30
|
+
}}
|
|
31
|
+
`;
|
|
32
|
+
|
|
33
|
+
function AlignSelector(props) {
|
|
34
|
+
const [isOpen, setIsOpen] = (0, _react.useState)(false);
|
|
35
|
+
const [menuHeight, setMenuHeight] = (0, _react.useState)(0);
|
|
36
|
+
const {
|
|
37
|
+
align,
|
|
38
|
+
options,
|
|
39
|
+
onChange,
|
|
40
|
+
onOpen
|
|
41
|
+
} = props;
|
|
42
|
+
(0, _react.useEffect)(() => {
|
|
43
|
+
const selectMenu = document.querySelector('.css-nabggt-menu');
|
|
44
|
+
|
|
45
|
+
if (selectMenu) {
|
|
46
|
+
const styles = window.getComputedStyle(selectMenu);
|
|
47
|
+
const margin = parseFloat(styles['marginTop']) + parseFloat(styles['marginBottom']);
|
|
48
|
+
setMenuHeight(selectMenu.offsetHeight + margin);
|
|
49
|
+
} else {
|
|
50
|
+
setMenuHeight(0);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (isOpen && onOpen) {
|
|
54
|
+
onOpen();
|
|
55
|
+
}
|
|
56
|
+
}, [isOpen]);
|
|
57
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(Label, {
|
|
58
|
+
htmlFor: "alignment"
|
|
59
|
+
}, "\u5C0D\u9F4A"), /*#__PURE__*/_react.default.createElement(AlignSelect, {
|
|
60
|
+
id: "alignment" // default align === undefined
|
|
61
|
+
,
|
|
62
|
+
value: options.find(option => option.value === align),
|
|
63
|
+
options: options,
|
|
64
|
+
onChange: option => {
|
|
65
|
+
onChange(option.value);
|
|
66
|
+
},
|
|
67
|
+
onMenuOpen: () => setIsOpen(true),
|
|
68
|
+
onMenuClose: () => setIsOpen(false),
|
|
69
|
+
menuHeight: menuHeight
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.AudioSelector = AudioSelector;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
11
|
+
|
|
12
|
+
var _modals = require("@keystone-ui/modals");
|
|
13
|
+
|
|
14
|
+
var _apollo = require("@keystone-6/core/admin-ui/apollo");
|
|
15
|
+
|
|
16
|
+
var _searchBox = require("./search-box");
|
|
17
|
+
|
|
18
|
+
var _pagination = require("./pagination");
|
|
19
|
+
|
|
20
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
+
|
|
22
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
23
|
+
|
|
24
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
25
|
+
|
|
26
|
+
const AudioSearchBox = (0, _styledComponents.default)(_searchBox.SearchBox)`
|
|
27
|
+
margin-top: 10px;
|
|
28
|
+
`;
|
|
29
|
+
const AudioSelectionWrapper = _styledComponents.default.div`
|
|
30
|
+
overflow: auto;
|
|
31
|
+
margin-top: 10px;
|
|
32
|
+
`;
|
|
33
|
+
const AudioGridsWrapper = _styledComponents.default.div`
|
|
34
|
+
display: flex;
|
|
35
|
+
flex-wrap: wrap;
|
|
36
|
+
overflow: auto;
|
|
37
|
+
`;
|
|
38
|
+
const AudioGridWrapper = _styledComponents.default.div`
|
|
39
|
+
flex: 0 0 50%;
|
|
40
|
+
cursor: pointer;
|
|
41
|
+
padding: 0 10px 10px;
|
|
42
|
+
`;
|
|
43
|
+
const AudioMetaGridsWrapper = _styledComponents.default.div`
|
|
44
|
+
display: flex;
|
|
45
|
+
flex-wrap: wrap;
|
|
46
|
+
overflow: auto;
|
|
47
|
+
`;
|
|
48
|
+
const AudioMetaGridWrapper = _styledComponents.default.div`
|
|
49
|
+
flex: 0 0 50%;
|
|
50
|
+
cursor: pointer;
|
|
51
|
+
padding: 0 10px 10px;
|
|
52
|
+
`;
|
|
53
|
+
const Audio = _styledComponents.default.audio`
|
|
54
|
+
width: 100%;
|
|
55
|
+
`;
|
|
56
|
+
const AudioName = _styledComponents.default.p`
|
|
57
|
+
text-align: center;
|
|
58
|
+
`;
|
|
59
|
+
const SeparationLine = _styledComponents.default.div`
|
|
60
|
+
border: #e1e5e9 1px solid;
|
|
61
|
+
margin-top: 10px;
|
|
62
|
+
margin-bottom: 10px;
|
|
63
|
+
`;
|
|
64
|
+
const AudioSelected = _styledComponents.default.div`
|
|
65
|
+
height: 1.4rem;
|
|
66
|
+
`;
|
|
67
|
+
const ErrorWrapper = _styledComponents.default.div`
|
|
68
|
+
& * {
|
|
69
|
+
margin: 0;
|
|
70
|
+
}
|
|
71
|
+
`;
|
|
72
|
+
|
|
73
|
+
function AudiosGrids(props) {
|
|
74
|
+
const {
|
|
75
|
+
audios,
|
|
76
|
+
selected,
|
|
77
|
+
onSelect
|
|
78
|
+
} = props;
|
|
79
|
+
return /*#__PURE__*/_react.default.createElement(AudioGridsWrapper, null, audios.map(audio => {
|
|
80
|
+
return /*#__PURE__*/_react.default.createElement(AudioGrid, {
|
|
81
|
+
key: audio.id,
|
|
82
|
+
isSelected: selected === null || selected === void 0 ? void 0 : selected.includes(audio),
|
|
83
|
+
onSelect: () => onSelect(audio),
|
|
84
|
+
audio: audio
|
|
85
|
+
});
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function AudioGrid(props) {
|
|
90
|
+
var _audio$file;
|
|
91
|
+
|
|
92
|
+
const {
|
|
93
|
+
audio,
|
|
94
|
+
onSelect,
|
|
95
|
+
isSelected
|
|
96
|
+
} = props;
|
|
97
|
+
return /*#__PURE__*/_react.default.createElement(AudioGridWrapper, {
|
|
98
|
+
key: audio === null || audio === void 0 ? void 0 : audio.id,
|
|
99
|
+
onClick: () => onSelect(audio)
|
|
100
|
+
}, /*#__PURE__*/_react.default.createElement(AudioSelected, null, isSelected ? /*#__PURE__*/_react.default.createElement("i", {
|
|
101
|
+
className: "fas fa-check-circle"
|
|
102
|
+
}) : null), /*#__PURE__*/_react.default.createElement(Audio, {
|
|
103
|
+
controls: true
|
|
104
|
+
}, /*#__PURE__*/_react.default.createElement("source", {
|
|
105
|
+
src: audio === null || audio === void 0 ? void 0 : audio.url
|
|
106
|
+
}), /*#__PURE__*/_react.default.createElement("source", {
|
|
107
|
+
src: audio === null || audio === void 0 ? void 0 : (_audio$file = audio.file) === null || _audio$file === void 0 ? void 0 : _audio$file.url
|
|
108
|
+
})), /*#__PURE__*/_react.default.createElement(AudioName, null, audio === null || audio === void 0 ? void 0 : audio.name));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function AudioMetaGrids(props) {
|
|
112
|
+
const {
|
|
113
|
+
audioMetas
|
|
114
|
+
} = props;
|
|
115
|
+
return /*#__PURE__*/_react.default.createElement(AudioMetaGridsWrapper, null, audioMetas.map(audioMeta => {
|
|
116
|
+
var _audioMeta$audio;
|
|
117
|
+
|
|
118
|
+
return /*#__PURE__*/_react.default.createElement(AudioMetaGrid, {
|
|
119
|
+
key: audioMeta === null || audioMeta === void 0 ? void 0 : (_audioMeta$audio = audioMeta.audio) === null || _audioMeta$audio === void 0 ? void 0 : _audioMeta$audio.id,
|
|
120
|
+
audioMeta: audioMeta
|
|
121
|
+
});
|
|
122
|
+
}));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function AudioMetaGrid(props) {
|
|
126
|
+
var _audio$file2;
|
|
127
|
+
|
|
128
|
+
const {
|
|
129
|
+
audioMeta
|
|
130
|
+
} = props;
|
|
131
|
+
const {
|
|
132
|
+
audio
|
|
133
|
+
} = audioMeta;
|
|
134
|
+
return /*#__PURE__*/_react.default.createElement(AudioMetaGridWrapper, null, /*#__PURE__*/_react.default.createElement(Audio, {
|
|
135
|
+
controls: true
|
|
136
|
+
}, /*#__PURE__*/_react.default.createElement("source", {
|
|
137
|
+
src: audio === null || audio === void 0 ? void 0 : audio.url
|
|
138
|
+
}), /*#__PURE__*/_react.default.createElement("source", {
|
|
139
|
+
src: audio === null || audio === void 0 ? void 0 : (_audio$file2 = audio.file) === null || _audio$file2 === void 0 ? void 0 : _audio$file2.url
|
|
140
|
+
})), /*#__PURE__*/_react.default.createElement(AudioName, null, audio === null || audio === void 0 ? void 0 : audio.name));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const AudiosQuery = (0, _apollo.gql)`
|
|
144
|
+
query Audios($searchText: String!, $take: Int, $skip: Int) {
|
|
145
|
+
audioFilesCount(where: { name: { contains: $searchText } })
|
|
146
|
+
audioFiles(
|
|
147
|
+
where: { name: { contains: $searchText } }
|
|
148
|
+
take: $take
|
|
149
|
+
skip: $skip
|
|
150
|
+
) {
|
|
151
|
+
id
|
|
152
|
+
name
|
|
153
|
+
url
|
|
154
|
+
file {
|
|
155
|
+
url
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
`;
|
|
160
|
+
|
|
161
|
+
function AudioSelector(props) {
|
|
162
|
+
const [queryAudios, {
|
|
163
|
+
loading,
|
|
164
|
+
error,
|
|
165
|
+
data: {
|
|
166
|
+
audioFiles = [],
|
|
167
|
+
audioFilesCount = 0
|
|
168
|
+
} = {}
|
|
169
|
+
}] = (0, _apollo.useLazyQuery)(AudiosQuery, {
|
|
170
|
+
fetchPolicy: 'no-cache'
|
|
171
|
+
});
|
|
172
|
+
const [currentPage, setCurrentPage] = (0, _react.useState)(0); // page starts with 1, 0 is used to detect initialization
|
|
173
|
+
|
|
174
|
+
const [searchText, setSearchText] = (0, _react.useState)('');
|
|
175
|
+
const [selected, setSelected] = (0, _react.useState)([]);
|
|
176
|
+
const pageSize = 6;
|
|
177
|
+
const {
|
|
178
|
+
onChange
|
|
179
|
+
} = props;
|
|
180
|
+
|
|
181
|
+
const onSave = () => {
|
|
182
|
+
onChange(selected);
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
const onCancel = () => {
|
|
186
|
+
onChange([]);
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
const onSearchBoxChange = async searchInput => {
|
|
190
|
+
setSearchText(searchInput);
|
|
191
|
+
setCurrentPage(1);
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
const onAudiosGridSelect = audioEntity => {
|
|
195
|
+
setSelected(selected => {
|
|
196
|
+
const filterdSelected = selected.filter(ele => {
|
|
197
|
+
var _ele$audio;
|
|
198
|
+
|
|
199
|
+
return ((_ele$audio = ele.audio) === null || _ele$audio === void 0 ? void 0 : _ele$audio.id) !== audioEntity.id;
|
|
200
|
+
}); // deselect the audio
|
|
201
|
+
|
|
202
|
+
if (filterdSelected.length !== selected.length) {
|
|
203
|
+
return filterdSelected;
|
|
204
|
+
} // single select
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
return [{
|
|
208
|
+
audio: audioEntity
|
|
209
|
+
}];
|
|
210
|
+
});
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
const selectedAudios = selected.map(ele => {
|
|
214
|
+
return ele.audio;
|
|
215
|
+
});
|
|
216
|
+
(0, _react.useEffect)(() => {
|
|
217
|
+
if (currentPage !== 0) {
|
|
218
|
+
queryAudios({
|
|
219
|
+
variables: {
|
|
220
|
+
searchText: searchText,
|
|
221
|
+
skip: (currentPage - 1) * pageSize,
|
|
222
|
+
take: pageSize
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}, [currentPage, searchText]);
|
|
227
|
+
|
|
228
|
+
let searchResult = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(AudiosGrids, {
|
|
229
|
+
audios: audioFiles,
|
|
230
|
+
selected: selectedAudios,
|
|
231
|
+
onSelect: onAudiosGridSelect
|
|
232
|
+
}), /*#__PURE__*/_react.default.createElement(_pagination.Pagination, {
|
|
233
|
+
currentPage: currentPage,
|
|
234
|
+
total: audioFilesCount,
|
|
235
|
+
pageSize: pageSize,
|
|
236
|
+
onChange: pageIndex => {
|
|
237
|
+
setCurrentPage(pageIndex);
|
|
238
|
+
}
|
|
239
|
+
}));
|
|
240
|
+
|
|
241
|
+
if (loading) {
|
|
242
|
+
searchResult = /*#__PURE__*/_react.default.createElement("p", null, "searching...");
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (error) {
|
|
246
|
+
searchResult = /*#__PURE__*/_react.default.createElement(ErrorWrapper, null, /*#__PURE__*/_react.default.createElement("h3", null, "Errors occurs in the `audios` query"), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("b", null, "Message:"), /*#__PURE__*/_react.default.createElement("div", null, error.message), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("b", null, "Stack:"), /*#__PURE__*/_react.default.createElement("div", null, error.stack), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("b", null, "Query:"), /*#__PURE__*/_react.default.createElement("pre", null, AudiosQuery.loc.source.body)));
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return /*#__PURE__*/_react.default.createElement(_modals.DrawerController, {
|
|
250
|
+
isOpen: true
|
|
251
|
+
}, /*#__PURE__*/_react.default.createElement(_modals.Drawer, {
|
|
252
|
+
title: "Select audio",
|
|
253
|
+
actions: {
|
|
254
|
+
cancel: {
|
|
255
|
+
label: 'Cancel',
|
|
256
|
+
action: onCancel
|
|
257
|
+
},
|
|
258
|
+
confirm: {
|
|
259
|
+
label: 'Confirm',
|
|
260
|
+
action: onSave
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(AudioSearchBox, {
|
|
264
|
+
onChange: onSearchBoxChange
|
|
265
|
+
}), /*#__PURE__*/_react.default.createElement(AudioSelectionWrapper, null, /*#__PURE__*/_react.default.createElement("div", null, searchResult), !!selected.length && /*#__PURE__*/_react.default.createElement(SeparationLine, null), /*#__PURE__*/_react.default.createElement(AudioMetaGrids, {
|
|
266
|
+
audioMetas: selected
|
|
267
|
+
})))));
|
|
268
|
+
}
|