├── .npmrc ├── .eslintignore ├── img ├── icon-32.png ├── icon-180.png ├── icon-192.png ├── icon-270.png ├── icon-512.png ├── screenshot.png ├── logo-white.svg └── logo.svg ├── screenshot.png ├── fonts ├── roboto.woff └── roboto-bold.woff ├── src ├── components │ ├── tooltip │ │ ├── _style.scss │ │ └── index.js │ ├── placeholder │ │ ├── _style.scss │ │ └── index.js │ ├── autosize-textarea │ │ ├── _style.scss │ │ └── index.js │ ├── tag-pagination │ │ ├── _style.scss │ │ └── index.js │ ├── date-navigation │ │ ├── _style.scss │ │ └── index.js │ ├── button-group │ │ ├── index.js │ │ └── _style.scss │ ├── done-text │ │ ├── _style.scss │ │ └── index.js │ ├── user │ │ ├── _style.scss │ │ └── index.js │ ├── icon │ │ └── _style.scss │ ├── tags-list │ │ ├── _style.scss │ │ └── index.js │ ├── root │ │ └── index.js │ ├── tag-dones │ │ ├── _style.scss │ │ ├── user.js │ │ ├── date.js │ │ └── index.js │ ├── page │ │ ├── _style.scss │ │ └── index.js │ ├── date-picker │ │ ├── _style.scss │ │ └── index.js │ ├── user-dones │ │ ├── _style.scss │ │ └── index.js │ ├── document-head │ │ └── index.js │ ├── sidebar │ │ ├── action.js │ │ ├── index.js │ │ └── _style.scss │ ├── notices │ │ ├── index.js │ │ └── _style.scss │ ├── popover-menu │ │ ├── _style.scss │ │ ├── index.js │ │ └── test │ │ │ └── index.js │ ├── done-status │ │ ├── _style.scss │ │ └── index.js │ ├── card │ │ ├── index.js │ │ └── _style.scss │ ├── mutative-request-prompt │ │ └── index.js │ ├── done-input │ │ ├── _style.scss │ │ ├── test │ │ │ └── index.js │ │ └── textarea.js │ ├── dones-list │ │ ├── _style.scss │ │ └── index.js │ ├── button │ │ ├── _style.scss │ │ ├── index.js │ │ └── test │ │ │ └── index.js │ ├── popover │ │ ├── index.js │ │ └── _style.scss │ └── link │ │ └── index.js ├── state │ ├── selectors │ │ ├── get-tags.js │ │ ├── get-route-path.js │ │ ├── get-title.js │ │ ├── get-done.js │ │ ├── get-request-nonce.js │ │ ├── get-user.js │ │ ├── has-received-tags.js │ │ ├── get-route-param.js │ │ ├── is-initial-route.js │ │ ├── get-formatted-title.js │ │ ├── is-capturing-request-preload.js │ │ ├── is-preloading-path.js │ │ ├── get-matched-route.js │ │ ├── get-users.js │ │ ├── get-notices.js │ │ ├── test │ │ │ ├── get-notices.js │ │ │ ├── has-received-tags.js │ │ │ ├── is-initial-route.js │ │ │ ├── has-received-dones.js │ │ │ ├── get-preloaded-response.js │ │ │ ├── is-mutative-request-in-flight.js │ │ │ ├── get-path-request.js │ │ │ ├── get-dones-for-user.js │ │ │ ├── get-sorted-users-by-date.js │ │ │ └── get-dones.js │ │ ├── is-mutative-request-in-flight.js │ │ ├── get-path-request.js │ │ ├── get-preloaded-response.js │ │ ├── has-received-dones.js │ │ ├── get-dones-for-user.js │ │ ├── get-dones-total-pages.js │ │ ├── get-sorted-dones.js │ │ ├── get-sorted-users-by-date.js │ │ ├── index.js │ │ └── get-dones.js │ ├── document-head │ │ ├── actions.js │ │ └── reducer.js │ ├── tags │ │ ├── actions.js │ │ ├── effects.js │ │ ├── reducer.js │ │ └── test │ │ │ └── reducer.js │ ├── users │ │ ├── actions.js │ │ ├── effects.js │ │ └── reducer.js │ ├── middlewares.js │ ├── effects.js │ ├── notices │ │ ├── effects.js │ │ ├── reducer.js │ │ ├── actions.js │ │ └── test │ │ │ └── reducer.js │ ├── test │ │ └── index.js │ ├── index.js │ ├── reducer.js │ ├── routing │ │ ├── actions.js │ │ ├── reducer.js │ │ ├── effects.js │ │ ├── middleware.js │ │ └── test │ │ │ └── reducer.js │ ├── requests │ │ ├── effects.js │ │ ├── actions.js │ │ ├── middleware.js │ │ ├── test │ │ │ └── middleware.js │ │ └── reducer.js │ ├── dones │ │ ├── actions.js │ │ ├── effects.js │ │ └── reducer.js │ └── action-types.js ├── assets │ └── stylesheets │ │ ├── _animation.scss │ │ ├── _placeholders.scss │ │ ├── _typography.scss │ │ ├── _vendor.scss │ │ ├── _variables.scss │ │ ├── _mixins.scss │ │ ├── main.scss │ │ └── _elements.scss ├── routes │ ├── not-found.js │ ├── tags.js │ ├── home.js │ ├── tag.js │ ├── date.js │ └── index.js ├── lib │ ├── callbackify │ │ ├── index.js │ │ └── test │ │ │ └── index.js │ ├── i18n │ │ └── index.js │ └── selection │ │ └── index.js ├── constant.js ├── test │ └── utils │ │ └── index.js └── index.js ├── .prettierrc.js ├── CREDITS.md ├── cypress.json ├── e2e ├── tests │ ├── .eslintrc.json │ └── create-done.js └── www │ └── index.html ├── .gitignore ├── postcss.config.js ├── composer.json ├── .editorconfig ├── jest.setup.js ├── style.css ├── bin ├── build-theme.sh └── download-languages.js ├── .travis.yml ├── .eslintrc.json ├── phpcs.xml ├── docker-compose.yml ├── manifest.json ├── inc ├── admin │ ├── about.css │ └── about.php ├── endpoints │ ├── class-wp-rest-dones-tags-controller.php │ └── class-wp-rest-dones-users-controller.php ├── tags.php └── updater.php ├── index.php ├── .babelrc ├── webpack.config.js ├── package.json └── CHANGELOG.md /.npmrc: -------------------------------------------------------------------------------- 1 | save-exact=true 2 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | vendor 4 | cypress 5 | -------------------------------------------------------------------------------- /img/icon-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aduth/dones/HEAD/img/icon-32.png -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aduth/dones/HEAD/screenshot.png -------------------------------------------------------------------------------- /fonts/roboto.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aduth/dones/HEAD/fonts/roboto.woff -------------------------------------------------------------------------------- /img/icon-180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aduth/dones/HEAD/img/icon-180.png -------------------------------------------------------------------------------- /img/icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aduth/dones/HEAD/img/icon-192.png -------------------------------------------------------------------------------- /img/icon-270.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aduth/dones/HEAD/img/icon-270.png -------------------------------------------------------------------------------- /img/icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aduth/dones/HEAD/img/icon-512.png -------------------------------------------------------------------------------- /img/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aduth/dones/HEAD/img/screenshot.png -------------------------------------------------------------------------------- /src/components/tooltip/_style.scss: -------------------------------------------------------------------------------- 1 | .tooltip { 2 | pointer-events: none; 3 | } 4 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = require( '@wordpress/scripts/config/.prettierrc.js' ); 2 | -------------------------------------------------------------------------------- /fonts/roboto-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aduth/dones/HEAD/fonts/roboto-bold.woff -------------------------------------------------------------------------------- /src/components/placeholder/_style.scss: -------------------------------------------------------------------------------- 1 | .placeholder { 2 | @include loading-pulse-text; 3 | } 4 | -------------------------------------------------------------------------------- /src/components/autosize-textarea/_style.scss: -------------------------------------------------------------------------------- 1 | .autosize-textarea { 2 | overflow-y: hidden; 3 | } 4 | -------------------------------------------------------------------------------- /src/state/selectors/get-tags.js: -------------------------------------------------------------------------------- 1 | export default function getTags( state ) { 2 | return state.tags; 3 | } 4 | -------------------------------------------------------------------------------- /CREDITS.md: -------------------------------------------------------------------------------- 1 | "Complete Tasks" icon by bezier master, with modifications, from the Noun Project (CC BY 3.0 US) 2 | -------------------------------------------------------------------------------- /cypress.json: -------------------------------------------------------------------------------- 1 | { 2 | "integrationFolder": "e2e/tests", 3 | "fileServerFolder": "e2e/www", 4 | "video": false 5 | } 6 | -------------------------------------------------------------------------------- /e2e/tests/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "mocha": true 4 | }, 5 | "globals": { 6 | "cy": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/components/tag-pagination/_style.scss: -------------------------------------------------------------------------------- 1 | .tag-pagination { 2 | display: flex; 3 | justify-content: space-between; 4 | } 5 | -------------------------------------------------------------------------------- /src/state/selectors/get-route-path.js: -------------------------------------------------------------------------------- 1 | export default function getRoutePath( state ) { 2 | return state.routing.path; 3 | } 4 | -------------------------------------------------------------------------------- /src/state/selectors/get-title.js: -------------------------------------------------------------------------------- 1 | export default function getTitle( state ) { 2 | return state.documentHead.title; 3 | } 4 | -------------------------------------------------------------------------------- /src/state/selectors/get-done.js: -------------------------------------------------------------------------------- 1 | export default function getDone( state, id ) { 2 | return state.dones.items[ id ] || null; 3 | } 4 | -------------------------------------------------------------------------------- /src/components/date-navigation/_style.scss: -------------------------------------------------------------------------------- 1 | .date-navigation .card__controls .button { 2 | color: darken( $border-color, 40% ); 3 | } 4 | -------------------------------------------------------------------------------- /src/state/selectors/get-request-nonce.js: -------------------------------------------------------------------------------- 1 | export default function getRequestNonce( state ) { 2 | return state.requests.nonce; 3 | } 4 | -------------------------------------------------------------------------------- /src/assets/stylesheets/_animation.scss: -------------------------------------------------------------------------------- 1 | @keyframes loading-pulse { 2 | 0% { opacity: .5; } 3 | 50% { opacity: 1; } 4 | 100% { opacity: .5; } 5 | } 6 | -------------------------------------------------------------------------------- /src/components/button-group/index.js: -------------------------------------------------------------------------------- 1 | export default function ButtonGroup( { children } ) { 2 | return
{ subtitle }
24 | ) } 25 |
61 | { ZERO_WIDTH_SPACE }
62 | { code }
63 | { ZERO_WIDTH_SPACE }
64 |
65 | ),
66 | },
67 | ];
68 |
69 | /**
70 | * Given array of children, returns transformed children
71 | *
72 | * @param {Array} children Original children
73 | * @return {Array} Transformed children
74 | */
75 | function getTransformedDoneText( children ) {
76 | let parts = [ ...toChildArray( children ) ];
77 |
78 | for ( const { pattern, transform } of TRANSFORMS ) {
79 | parts = reduce(
80 | parts,
81 | ( memo, part ) => {
82 | if ( 'string' !== typeof part ) {
83 | return memo.concat( part );
84 | }
85 |
86 | let match;
87 | while ( ( match = part.match( pattern ) ) ) {
88 | memo.push( part.substr( 0, match.index ) );
89 | memo = memo.concat( transform( match ) );
90 | part = part.substr( match.index + match[ 0 ].length );
91 | }
92 |
93 | memo.push( part );
94 |
95 | return memo;
96 | },
97 | []
98 | );
99 | }
100 |
101 | return parts;
102 | }
103 |
104 | function DoneText( { onClick, onFocus, onMouseDown, children } ) {
105 | const node = useRef();
106 |
107 | function setCopyText( event ) {
108 | // Override the clipboard data with the original children text to avoid
109 | // zero-width spaces, and because its generally more useful if planned
110 | // to paste into a separate new done.
111 |
112 | let setData;
113 | if ( window.clipboardData ) {
114 | setData = ( text ) => window.clipboardData.setData( 'Text', text );
115 | } else if ( event.clipboardData ) {
116 | setData = ( text ) =>
117 | event.clipboardData.setData( 'text/plain', text );
118 | }
119 |
120 | if ( ! setData ) {
121 | return;
122 | }
123 |
124 | const [ start, end ] = getSelectedOffset( node.current );
125 | const text = children.join( '' ).slice( start, end );
126 | setData( text );
127 | event.preventDefault();
128 | }
129 |
130 | // Infer focus handlers as intent to edit. Ensure element can receive focus
131 | // and apply ARIA role to indicate editability.
132 | let focusProps;
133 | if ( onFocus ) {
134 | focusProps = {
135 | tabIndex: 0,
136 | role: 'textbox',
137 | onFocus,
138 | };
139 | }
140 |
141 | return (
142 | /* eslint-disable jsx-a11y/click-events-have-key-events */
143 | /* eslint-disable jsx-a11y/no-static-element-interactions */
144 | 26 | dones list, if you will). With an emphasis on collaboration, tagging, and aggregating, Dones helps organize and keep your team in sync.', 29 | 'dones' 30 | ), array( 'em' => array() ) ); 31 | ?> 32 |
33 |
39 | 40 | adding user accounts for each member of your team, assigning any user role with permission to create posts (Contributor or above). Newly created users will appear automatically on the front page of your site. Once they have logged in, members of your team can immediately start adding new "dones" to record their progress.', 45 | 'dones' 46 | ), 47 | admin_url( 'user-new.php' ) 48 | ), array( 'a' => array( 'href' => array() ) ) ); 49 | ?> 50 |
51 |52 | Customizer, where you’ll find options to change the primary color of the site and site logo to match your team or company’s brand.', 57 | 'dones' 58 | ), 59 | add_query_arg( 'return', urlencode( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ), admin_url( 'customize.php' ) ) 60 | ), array( 'a' => array( 'href' => array() ) ) ); 61 | ?> 62 |
63 | 64 |