@sanity/language-filter 0.147.10-next.22 → 1.0.0-firstpass-v3-impl.1
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/LICENSE +1 -1
- package/README.md +122 -28
- package/lib/cjs/index.js +338 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/esm/index.js +329 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/types/index.d.ts +73 -0
- package/lib/types/index.d.ts.map +1 -0
- package/package.json +77 -27
- package/sanity.json +2 -10
- package/src/LanguageFilterMenuButton.tsx +128 -0
- package/src/LanguageFilterObjectInput.tsx +33 -0
- package/src/filterField.test.ts +91 -0
- package/src/filterField.ts +34 -0
- package/src/index.ts +26 -0
- package/src/plugin.tsx +67 -0
- package/src/types.ts +27 -0
- package/src/usePaneLanguages.ts +81 -0
- package/v2-incompatible.js +11 -0
- package/lib/SelectLanguage.js +0 -139
- package/lib/SelectLanguageProvider.js +0 -52
- package/lib/datastore.js +0 -48
- package/lib/filter-fields.js +0 -13
- package/lib/styles/SelectLanguage.css +0 -50
- package/src/SelectLanguage.js +0 -106
- package/src/SelectLanguageProvider.js +0 -28
- package/src/datastore.js +0 -42
- package/src/filter-fields.js +0 -1
- package/src/styles/SelectLanguage.css +0 -50
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _react = _interopRequireDefault(require("react"));
|
|
9
|
-
|
|
10
|
-
var _datastore = require("./datastore");
|
|
11
|
-
|
|
12
|
-
var _SelectLanguage = _interopRequireDefault(require("./SelectLanguage"));
|
|
13
|
-
|
|
14
|
-
var _config = _interopRequireDefault(require("part:@sanity/language-filter/config"));
|
|
15
|
-
|
|
16
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
-
|
|
18
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
19
|
-
|
|
20
|
-
class SelectLanguageProvider extends _react.default.Component {
|
|
21
|
-
constructor() {
|
|
22
|
-
super(...arguments);
|
|
23
|
-
|
|
24
|
-
_defineProperty(this, "state", {
|
|
25
|
-
selected: []
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
componentDidMount(props) {
|
|
30
|
-
this.subscription = _datastore.selectedLanguages$.subscribe(selected => {
|
|
31
|
-
this.setState({
|
|
32
|
-
selected: selected
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
componentWillUnmount(props) {
|
|
38
|
-
this.subscription.unsubscribe();
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
render() {
|
|
42
|
-
var selected = this.state.selected;
|
|
43
|
-
return _react.default.createElement(_SelectLanguage.default, {
|
|
44
|
-
languages: _config.default.supportedLanguages,
|
|
45
|
-
selected: selected,
|
|
46
|
-
onChange: _datastore.setLangs
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
exports.default = SelectLanguageProvider;
|
package/lib/datastore.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.filterFn$ = exports.selectedLanguages$ = exports.setLangs = void 0;
|
|
7
|
-
|
|
8
|
-
var _intersection2 = _interopRequireDefault(require("lodash/intersection"));
|
|
9
|
-
|
|
10
|
-
var _rxjs = require("rxjs");
|
|
11
|
-
|
|
12
|
-
var _operators = require("rxjs/operators");
|
|
13
|
-
|
|
14
|
-
var _config = _interopRequireDefault(require("part:@sanity/language-filter/config"));
|
|
15
|
-
|
|
16
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
-
|
|
18
|
-
var onSelect$ = new _rxjs.Subject();
|
|
19
|
-
|
|
20
|
-
var setLangs = langs => onSelect$.next(langs);
|
|
21
|
-
|
|
22
|
-
exports.setLangs = setLangs;
|
|
23
|
-
|
|
24
|
-
var persistOn = (key, defaultValue) => input$ => {
|
|
25
|
-
var persisted;
|
|
26
|
-
|
|
27
|
-
try {
|
|
28
|
-
persisted = JSON.parse(window.localStorage.getItem(key));
|
|
29
|
-
} catch (err) {} // eslint-disable-line no-empty
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return input$.pipe((0, _operators.startWith)(persisted || defaultValue), (0, _operators.tap)(value => {
|
|
33
|
-
window.localStorage.setItem(key, JSON.stringify(value));
|
|
34
|
-
}));
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
var SUPPORTED_LANG_IDS = _config.default.supportedLanguages.map(lang => lang.id);
|
|
38
|
-
|
|
39
|
-
var selectedLanguages$ = onSelect$.pipe((0, _operators.map)(selectedLangs => (0, _intersection2.default)(selectedLangs, SUPPORTED_LANG_IDS)), (0, _operators.publishReplay)(1), (0, _operators.refCount)(), persistOn('@sanity/plugin/language-filter/selected-languages', SUPPORTED_LANG_IDS));
|
|
40
|
-
exports.selectedLanguages$ = selectedLanguages$;
|
|
41
|
-
|
|
42
|
-
var defaultFilterField = (enclosingType, field, selectedLanguages) => !enclosingType.name.startsWith('locale') || selectedLanguages.includes(field.name);
|
|
43
|
-
|
|
44
|
-
var filterField = _config.default.filterField || defaultFilterField;
|
|
45
|
-
var filterFn$ = selectedLanguages$.pipe((0, _operators.map)(langs => {
|
|
46
|
-
return (enclosingType, field) => filterField(enclosingType, field, langs);
|
|
47
|
-
}));
|
|
48
|
-
exports.filterFn$ = filterFn$;
|
package/lib/filter-fields.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
Object.defineProperty(exports, "default", {
|
|
7
|
-
enumerable: true,
|
|
8
|
-
get: function get() {
|
|
9
|
-
return _datastore.filterFn$;
|
|
10
|
-
}
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
var _datastore = require("./datastore");
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
@import 'part:@sanity/base/theme/variables-style';
|
|
2
|
-
|
|
3
|
-
.target {
|
|
4
|
-
display: flex;
|
|
5
|
-
align-items: center;
|
|
6
|
-
color: var(--text-color);
|
|
7
|
-
opacity: 1;
|
|
8
|
-
min-width: 4rem;
|
|
9
|
-
font-size: var(--font-size-xsmall);
|
|
10
|
-
white-space: nowrap;
|
|
11
|
-
height: 2.5rem;
|
|
12
|
-
align-self: center;
|
|
13
|
-
margin-right: 1em;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
.arrow {
|
|
17
|
-
margin-left: 0.4em;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
.root {
|
|
21
|
-
padding: 0.5em;
|
|
22
|
-
background-color: var(--component-bg);
|
|
23
|
-
color: var(--text-color);
|
|
24
|
-
composes: shadow-6dp from 'part:@sanity/base/theme/shadows-style';
|
|
25
|
-
user-select: none;
|
|
26
|
-
text-align: left;
|
|
27
|
-
overflow: auto;
|
|
28
|
-
overflow-x: hidden;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
.list {
|
|
32
|
-
composes: resetList from 'part:@sanity/base/theme/layout/helpers';
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
.functions {
|
|
36
|
-
padding: 0.5em;
|
|
37
|
-
text-align: center;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
.selectedNumFilter {
|
|
41
|
-
color: var(--state-danger-color);
|
|
42
|
-
font-weight: bold;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
.item {
|
|
46
|
-
padding: 0.5em;
|
|
47
|
-
composes: resetListItem from 'part:@sanity/base/theme/layout/helpers';
|
|
48
|
-
composes: item from 'part:@sanity/base/theme/layout/selectable-style';
|
|
49
|
-
white-space: nowrap;
|
|
50
|
-
}
|
package/src/SelectLanguage.js
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
/* eslint-disable complexity */
|
|
2
|
-
import React, {Fragment} from 'react'
|
|
3
|
-
import PropTypes from 'prop-types'
|
|
4
|
-
import Poppable from 'part:@sanity/components/utilities/poppable'
|
|
5
|
-
import Checkbox from 'part:@sanity/components/toggles/checkbox'
|
|
6
|
-
import Button from 'part:@sanity/components/buttons/default'
|
|
7
|
-
import styles from './styles/SelectLanguage.css'
|
|
8
|
-
import AngleDown from 'part:@sanity/base/angle-down-icon'
|
|
9
|
-
import AngleUp from 'part:@sanity/base/angle-up-icon'
|
|
10
|
-
|
|
11
|
-
const LanguagePropType = PropTypes.shape({id: PropTypes.string, title: PropTypes.string})
|
|
12
|
-
export default class SelectLanguage extends React.Component {
|
|
13
|
-
static propTypes = {
|
|
14
|
-
languages: PropTypes.arrayOf(LanguagePropType),
|
|
15
|
-
selected: PropTypes.arrayOf(LanguagePropType),
|
|
16
|
-
onChange: PropTypes.func
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
state = {isOpen: false}
|
|
20
|
-
refElement = React.createRef()
|
|
21
|
-
|
|
22
|
-
handleToggle = () => this.setState(prevState => ({isOpen: !prevState.isOpen}))
|
|
23
|
-
handleOpen = () => this.setState({isOpen: true})
|
|
24
|
-
handleClose = () => {
|
|
25
|
-
this.setState({isOpen: false})
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
selectLang = langId => {
|
|
29
|
-
const {selected, onChange} = this.props
|
|
30
|
-
onChange(selected.concat(langId))
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
unselectLang = langId => {
|
|
34
|
-
const {selected, onChange} = this.props
|
|
35
|
-
onChange(selected.filter(id => id !== langId))
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
handleSelectAll = event => {
|
|
39
|
-
const {languages, onChange} = this.props
|
|
40
|
-
onChange(languages.map(l => l.id))
|
|
41
|
-
}
|
|
42
|
-
handleSelectNone = event => {
|
|
43
|
-
const {onChange} = this.props
|
|
44
|
-
onChange([])
|
|
45
|
-
}
|
|
46
|
-
handleLangCheckboxChange = event => {
|
|
47
|
-
const id = event.target.getAttribute('data-lang-id')
|
|
48
|
-
const checked = event.target.checked
|
|
49
|
-
this[checked ? 'selectLang' : 'unselectLang'](id)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
render() {
|
|
53
|
-
const {isOpen} = this.state
|
|
54
|
-
const {languages, selected} = this.props
|
|
55
|
-
const allIsSelected = languages.length === selected.length
|
|
56
|
-
const refElement =
|
|
57
|
-
this.refElement && this.refElement.current && this.refElement.current._element
|
|
58
|
-
|
|
59
|
-
return (
|
|
60
|
-
<Fragment>
|
|
61
|
-
<span
|
|
62
|
-
className={styles.target}
|
|
63
|
-
onClick={this.handleToggle}
|
|
64
|
-
ref={this.refElement}
|
|
65
|
-
title={
|
|
66
|
-
allIsSelected
|
|
67
|
-
? 'Filter language fields'
|
|
68
|
-
: 'Displaying only fields for selected languages'
|
|
69
|
-
}
|
|
70
|
-
>
|
|
71
|
-
Filter languages{allIsSelected ? '…' : ` (${selected.length}/${languages.length})`}
|
|
72
|
-
<span className={styles.arrow}>{isOpen ? <AngleUp /> : <AngleDown />}</span>
|
|
73
|
-
</span>
|
|
74
|
-
<Poppable
|
|
75
|
-
onEscape={this.handleClose}
|
|
76
|
-
onClickOutside={this.handleClose}
|
|
77
|
-
placement="bottom-end"
|
|
78
|
-
referenceElement={refElement}
|
|
79
|
-
>
|
|
80
|
-
{isOpen && (
|
|
81
|
-
<div className={styles.root}>
|
|
82
|
-
<div className={styles.functions}>
|
|
83
|
-
<Button onClick={allIsSelected ? this.handleSelectNone : this.handleSelectAll}>
|
|
84
|
-
Select {allIsSelected ? 'none' : 'all'}
|
|
85
|
-
</Button>
|
|
86
|
-
</div>
|
|
87
|
-
<ul className={styles.list}>
|
|
88
|
-
{languages.map(lang => (
|
|
89
|
-
<li className={styles.item} key={lang.id}>
|
|
90
|
-
<Checkbox
|
|
91
|
-
onChange={this.handleLangCheckboxChange}
|
|
92
|
-
data-lang-id={lang.id}
|
|
93
|
-
checked={selected.includes(lang.id)}
|
|
94
|
-
>
|
|
95
|
-
{lang.title}
|
|
96
|
-
</Checkbox>
|
|
97
|
-
</li>
|
|
98
|
-
))}
|
|
99
|
-
</ul>
|
|
100
|
-
</div>
|
|
101
|
-
)}
|
|
102
|
-
</Poppable>
|
|
103
|
-
</Fragment>
|
|
104
|
-
)
|
|
105
|
-
}
|
|
106
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import {selectedLanguages$, setLangs} from './datastore'
|
|
3
|
-
import SelectLanguage from './SelectLanguage'
|
|
4
|
-
import config from 'part:@sanity/language-filter/config'
|
|
5
|
-
|
|
6
|
-
export default class SelectLanguageProvider extends React.Component {
|
|
7
|
-
state = {selected: []}
|
|
8
|
-
|
|
9
|
-
componentDidMount(props) {
|
|
10
|
-
this.subscription = selectedLanguages$.subscribe(selected => {
|
|
11
|
-
this.setState({selected: selected})
|
|
12
|
-
})
|
|
13
|
-
}
|
|
14
|
-
componentWillUnmount(props) {
|
|
15
|
-
this.subscription.unsubscribe()
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
render() {
|
|
19
|
-
const {selected} = this.state
|
|
20
|
-
return (
|
|
21
|
-
<SelectLanguage
|
|
22
|
-
languages={config.supportedLanguages}
|
|
23
|
-
selected={selected}
|
|
24
|
-
onChange={setLangs}
|
|
25
|
-
/>
|
|
26
|
-
)
|
|
27
|
-
}
|
|
28
|
-
}
|
package/src/datastore.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import {Subject} from 'rxjs'
|
|
2
|
-
import {map, publishReplay, refCount, startWith, tap} from 'rxjs/operators'
|
|
3
|
-
import config from 'part:@sanity/language-filter/config'
|
|
4
|
-
import {intersection} from 'lodash'
|
|
5
|
-
|
|
6
|
-
const onSelect$ = new Subject()
|
|
7
|
-
|
|
8
|
-
export const setLangs = langs => onSelect$.next(langs)
|
|
9
|
-
|
|
10
|
-
const persistOn = (key, defaultValue) => input$ => {
|
|
11
|
-
let persisted
|
|
12
|
-
try {
|
|
13
|
-
persisted = JSON.parse(window.localStorage.getItem(key))
|
|
14
|
-
} catch (err) {} // eslint-disable-line no-empty
|
|
15
|
-
|
|
16
|
-
return input$.pipe(
|
|
17
|
-
startWith(persisted || defaultValue),
|
|
18
|
-
tap(value => {
|
|
19
|
-
window.localStorage.setItem(key, JSON.stringify(value))
|
|
20
|
-
})
|
|
21
|
-
)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const SUPPORTED_LANG_IDS = config.supportedLanguages.map(lang => lang.id)
|
|
25
|
-
|
|
26
|
-
export const selectedLanguages$ = onSelect$.pipe(
|
|
27
|
-
map(selectedLangs => intersection(selectedLangs, SUPPORTED_LANG_IDS)),
|
|
28
|
-
publishReplay(1),
|
|
29
|
-
refCount(),
|
|
30
|
-
persistOn('@sanity/plugin/language-filter/selected-languages', SUPPORTED_LANG_IDS)
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
const defaultFilterField = (enclosingType, field, selectedLanguages) =>
|
|
34
|
-
!enclosingType.name.startsWith('locale') || selectedLanguages.includes(field.name)
|
|
35
|
-
|
|
36
|
-
const filterField = config.filterField || defaultFilterField
|
|
37
|
-
|
|
38
|
-
export const filterFn$ = selectedLanguages$.pipe(
|
|
39
|
-
map(langs => {
|
|
40
|
-
return (enclosingType, field) => filterField(enclosingType, field, langs)
|
|
41
|
-
})
|
|
42
|
-
)
|
package/src/filter-fields.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {filterFn$ as default} from './datastore'
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
@import 'part:@sanity/base/theme/variables-style';
|
|
2
|
-
|
|
3
|
-
.target {
|
|
4
|
-
display: flex;
|
|
5
|
-
align-items: center;
|
|
6
|
-
color: var(--text-color);
|
|
7
|
-
opacity: 1;
|
|
8
|
-
min-width: 4rem;
|
|
9
|
-
font-size: var(--font-size-xsmall);
|
|
10
|
-
white-space: nowrap;
|
|
11
|
-
height: 2.5rem;
|
|
12
|
-
align-self: center;
|
|
13
|
-
margin-right: 1em;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
.arrow {
|
|
17
|
-
margin-left: 0.4em;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
.root {
|
|
21
|
-
padding: 0.5em;
|
|
22
|
-
background-color: var(--component-bg);
|
|
23
|
-
color: var(--text-color);
|
|
24
|
-
composes: shadow-6dp from 'part:@sanity/base/theme/shadows-style';
|
|
25
|
-
user-select: none;
|
|
26
|
-
text-align: left;
|
|
27
|
-
overflow: auto;
|
|
28
|
-
overflow-x: hidden;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
.list {
|
|
32
|
-
composes: resetList from 'part:@sanity/base/theme/layout/helpers';
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
.functions {
|
|
36
|
-
padding: 0.5em;
|
|
37
|
-
text-align: center;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
.selectedNumFilter {
|
|
41
|
-
color: var(--state-danger-color);
|
|
42
|
-
font-weight: bold;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
.item {
|
|
46
|
-
padding: 0.5em;
|
|
47
|
-
composes: resetListItem from 'part:@sanity/base/theme/layout/helpers';
|
|
48
|
-
composes: item from 'part:@sanity/base/theme/layout/selectable-style';
|
|
49
|
-
white-space: nowrap;
|
|
50
|
-
}
|