├── .babelrc ├── .eslintignore ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .npmignore ├── .nvmrc ├── Documentation ├── VisualLanguage.html └── conventions.md ├── LICENSE.md ├── README.md ├── dev ├── index.html ├── loader.ts └── pane │ └── index.ts ├── doc └── images │ ├── panes-for-classes.epgz │ └── panes-for-classes.svg ├── eslint.config.mjs ├── jest.config.js ├── jest.setup.ts ├── package-lock.json ├── package.json ├── src ├── RDFXMLPane.js ├── argument │ ├── argumentPane.js │ ├── argument_icon_v04.jpg │ ├── icon_argument.png │ └── transparentyingyang.png ├── attach │ ├── attachPane.js │ ├── tbl-paperclip-128.png │ ├── tbl-paperclip-22.png │ └── tbl-paperclip-22a.png ├── audio │ └── audioPane.js ├── chatPreferencesForm.ttl ├── classInstancePane.js ├── dashboard │ ├── basicPreferences.ts │ ├── dashboardPane.ts │ ├── homepage.ts │ ├── languages │ │ ├── codes.html │ │ ├── codes.xml │ │ ├── codes2.txt │ │ ├── foo │ │ ├── foo.ttl │ │ └── get-language-names.sh │ ├── ontologyData.ttl │ └── preferencesFormText.ttl ├── dataContentPane.js ├── defaultPane.js ├── dokieli │ ├── Makefile │ ├── dokieliPane.js │ ├── new.html │ └── new.js ├── form │ ├── form-22.png │ ├── form-b-22.png │ ├── form.graffle │ ├── form.png │ ├── pane.js │ └── psuedocode-notes.txt ├── global.d.ts ├── home │ └── homePane.ts ├── humanReadablePane.js ├── imagePane.js ├── index.ts ├── internal │ └── internalPane.ts ├── mainPage │ ├── footer.ts │ ├── header.ts │ └── index.ts ├── meeting │ ├── Makefile │ └── test │ │ └── meeting1 │ │ ├── Actions │ │ ├── actions.ttl │ │ ├── config.ttl │ │ └── state.ttl │ │ ├── Schedule │ │ ├── details.ttl │ │ ├── details.ttl.acl │ │ ├── forms.ttl │ │ ├── forms.ttl.acl │ │ ├── index.html │ │ ├── index.html.acl │ │ ├── results.ttl │ │ └── results.ttl.acl │ │ ├── SharedNotes │ │ └── pad.ttl │ │ ├── chat │ │ └── chat.ttl │ │ ├── details.ttl │ │ └── pad │ │ └── pad.ttl ├── microblogPane │ ├── mbStyle.css │ └── microblogPane.js ├── n3Pane.js ├── outline │ ├── context.ts │ ├── manager.js │ ├── manager.test.ts │ ├── outlineIcons.js │ ├── propertyViews.test.ts │ ├── propertyViews.ts │ ├── queryByExample.js │ ├── userInput.js │ ├── viewAsImage.ts │ └── viewAsMbox.ts ├── pad │ ├── images │ │ ├── ColourOff.ai │ │ ├── ColourOff.png │ │ ├── ColourOn.ai │ │ └── ColourOn.png │ └── padPane.ts ├── playlist │ └── playlistPane.js ├── registerPanes.js ├── schedule │ ├── Makefile │ ├── formsForSchedule.js │ ├── formsForSchedule.ttl │ └── schedulePane.js ├── sharing │ └── sharingPane.ts ├── slideshow │ └── slideshowPane.js ├── socialPane.js ├── style │ └── tabbedtab.css ├── tabbed │ └── tabbedPane.ts ├── tableViewPane.js ├── test-import-export │ ├── common.js │ ├── edit-importer.js │ └── testImportExport.js ├── transaction │ ├── 068010-3d-transparent-glass-icon-alphanumeric-dollar-sign.png │ ├── 075988-3d-transparent-glass-icon-business-currency-british-pound-sc35.png │ ├── 22-pixel-068010-3d-transparent-glass-icon-alphanumeric-dollar-sign.png │ ├── pane.js │ ├── period.js │ ├── thumbs_075987-3d-transparent-glass-icon-business-creditcard2.png │ └── thumbs_075989-3d-transparent-glass-icon-business-currency-cent-sc35.png ├── trip │ └── tripPane.js ├── trustedApplications │ ├── __snapshots__ │ │ └── trustedApplications.test.ts.snap │ ├── trustedApplications.dom.ts │ ├── trustedApplications.test.ts │ ├── trustedApplications.utils.ts │ └── trustedApplications.view.ts ├── types.ts ├── ui │ ├── 22-builder.png │ ├── builder.graffle │ ├── builder.png │ ├── builder2.png │ └── pane.js └── video │ └── videoPane.js ├── timestamp.sh ├── travis └── bumpversion.js ├── tsconfig.json ├── typings ├── raw-loader.d.ts └── solid-namespace │ └── index.d.ts └── webpack.config.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/preset-env", 4 | "@babel/preset-typescript" 5 | ], 6 | "plugins": [ 7 | [ 8 | "babel-plugin-inline-import", 9 | { 10 | "extensions": [ 11 | ".ttl" 12 | ] 13 | } 14 | ] 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | dist 2 | lib 3 | typings/rdflib 4 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: CI 5 | 6 | on: 7 | push: 8 | branches: 9 | - "**" 10 | pull_request: 11 | branches: 12 | - "**" 13 | workflow_dispatch: 14 | 15 | jobs: 16 | build: 17 | 18 | runs-on: ubuntu-latest 19 | 20 | strategy: 21 | matrix: 22 | node-version: 23 | - 18.x 24 | - 20.x 25 | 26 | steps: 27 | - uses: actions/checkout@v4 28 | - name: Use Node.js ${{ matrix.node-version }} 29 | uses: actions/setup-node@v4 30 | with: 31 | node-version: ${{ matrix.node-version }} 32 | - run: npm ci 33 | - run: npm run lint --if-present 34 | - run: npm test 35 | - run: npm run build --if-present 36 | - name: Save build 37 | if: matrix.node-version == '18.x' 38 | uses: actions/upload-artifact@v4 39 | with: 40 | name: build 41 | path: | 42 | . 43 | !node_modules 44 | retention-days: 1 45 | 46 | npm-publish-build: 47 | needs: build 48 | runs-on: ubuntu-latest 49 | steps: 50 | - uses: actions/download-artifact@v4 51 | with: 52 | name: build 53 | - uses: actions/setup-node@v4 54 | with: 55 | node-version: 18.x 56 | - uses: rlespinasse/github-slug-action@v3.x 57 | - name: Append commit hash to package version 58 | run: 'sed -i -E "s/(\"version\": *\"[^\"]+)/\1-${GITHUB_SHA_SHORT}/" package.json' 59 | - name: Disable pre- and post-publish actions 60 | run: 'sed -i -E "s/\"((pre|post)publish)/\"ignore:\1/" package.json' 61 | - uses: JS-DevTools/npm-publish@v1 62 | with: 63 | token: ${{ secrets.NPM_TOKEN }} 64 | tag: ${{ env.GITHUB_REF_SLUG }} 65 | 66 | npm-publish-latest: 67 | needs: build 68 | runs-on: ubuntu-latest 69 | if: github.ref == 'refs/heads/main' 70 | steps: 71 | - uses: actions/download-artifact@v4 72 | with: 73 | name: build 74 | - uses: actions/setup-node@v1 75 | with: 76 | node-version: 18.x 77 | - name: Disable pre- and post-publish actions 78 | run: 'sed -i -E "s/\"((pre|post)publish)/\"ignore:\1/" package.json' 79 | - uses: JS-DevTools/npm-publish@v1 80 | with: 81 | token: ${{ secrets.NPM_TOKEN }} 82 | tag: latest 83 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Built code 2 | dist 3 | lib 4 | src/versionInfo.ts 5 | 6 | # Logs 7 | logs 8 | *.log 9 | npm-debug.log* 10 | 11 | # Runtime data 12 | pids 13 | *.pid 14 | *.seed 15 | 16 | # Directory for instrumented libs generated by jscoverage/JSCover 17 | lib-cov 18 | 19 | # Coverage directory used by tools like istanbul 20 | coverage 21 | 22 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 23 | .grunt 24 | 25 | # node-waf configuration 26 | .lock-wscript 27 | 28 | # Compiled binary addons (http://nodejs.org/api/addons.html) 29 | build/Release 30 | 31 | # Dependency directory 32 | node_modules 33 | 34 | # Optional npm cache directory 35 | .npm 36 | 37 | # Optional REPL history 38 | .node_repl_history 39 | 40 | # files used by IDEs such as WebStorm 41 | .idea 42 | 43 | # history files in Visual Code 44 | .history 45 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # This file primarily exists to prevent ./dist from being ignored when publishing. 2 | # (Because it's listed in .gitignore). 3 | 4 | coverage -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v18.19.0 2 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 - present 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # solid-panes 2 | 3 | A set of core solid-compatible applets based on solid-ui 4 | 5 | These are a set of interlinked applications, or parts of applications, 6 | which called 'panes' -- as in parts of a window. A pane displays a data object of certain class using part of the window. 7 | They don't tile like window panes necessarily, but one pane can involve other panes to display 8 | objects related to the main object, in all kinds of creative ways. You can give the sub-pane a bit of 9 | HTML DOM element to work in, and the data object, and it does the rest. 10 | 11 | You can explicitly invoke a specific sub-pane, or you can just provide a DOM element to contain it, 12 | and ask the pane system to pick the appropriate pane. It does this by calling each potential pane in order 13 | with the object, and asking whether it wants to render that object. Typically the pane chosen is the most specific pane, 14 | so typically a hand-written user interface will be chosen over a generic machine-generated one. 15 | 16 | These panes are used in the Data Browser - see mashlib 17 | [https://github.com/linkeddata/mashlib](https://github.com/linkeddata/mashlib) 18 | 19 | Currently the panes available include: 20 | 21 | - A default pane which lists the properties of any object 22 | - An internals pane which allows the URI and the HTTP fetch history to be checked 23 | - A pane for Address Books, Groups as well as individual Contacts 24 | - A pane for seeing pictures in a slideshow 25 | - A pane for a playlist of YouTube videos 26 | - A pane for a range of issue trackers, to-do-lists, agendas, etc 27 | - A file and directory manager for a Solid/LDP hierarchical file store 28 | - A Sharing pane to control the Access Control Lists for any object or folder 29 | - and so on 30 | 31 | The solid-app-set panes are built using a set of widgets and utilities in 32 | [https://github.com/linkeddata/solid-ui](https://github.com/linkeddata/solid-ui) 33 | 34 | To help onboarding, we're using [roles](https://github.com/solidos/userguide/#role) to limit the number of panes presented 35 | to new users. 36 | 37 | ## Goals 38 | 39 | - Make the system module in terms of NPM modules; one for each pane 40 | 41 | - Allow (signed?) panes to be advertised in turtle data in the web, and loaded automatically 42 | 43 | - Allow a Solid user to save preferences for which panes are used for which data types. 44 | 45 | - Create new panes for playlist and photo management and sharing, fitness, etc 46 | 47 | Volunteers are always welcome! 48 | 49 | ## Documentation 50 | - [Visual Language](https://solidos.github.io/solid-panes/Documentation/VisualLanguage.html) 51 | - [Conventions](./Documentation/conventions.md) 52 | 53 | ## Development 54 | To get started, make sure you have Node.js installed (for instance 55 | through https://github.com/nvm-sh/nvm), and: 56 | 1. run 57 | ```sh 58 | git clone https://github.com/solidos/solid-panes 59 | cd solid-panes 60 | npm install 61 | npm run start 62 | ``` 63 | 2. a browser window should automatically open at http://localhost:9000, if for some reason it doesn't go ahead and manually navigate there. 64 | 3. Once you arrive at the Solid Pane Tester page, the `profile-pane` will be loaded by default. Proceed to edit `solid-panes/dev/loader.ts` and, at line 5, you should see `import Pane from 'profile-pane'`. Simply change `'profile-pane'` to your preferred pane/directory containing the pane of choice; for example, you could choose `'source-pane'` and bam, it will load that pane. For those who are new, you can go to the `solid-panes/src` directory and manually navigate through each individual folder. In most folders, you simply look for any file that has `pane` in the title. Copy and paste the `pane.js` file of your choice into the `solid-panes/dev/pane` folder, or you can import directly from the `src` directory. For example, importing from `'../src/dokieli/dokieliPane'` will work just fine. Each time you save `solid-panes/dev/loader.ts` while importing a different pane, your browser at `http://localhost:9000/` should automatically refresh. It's a good idea to keep the developer console open in your web browser to ensure panes are loading and rendering properly. 65 | 66 | 4. Another tip: to ensure you arrive at the proper destination, look at lines 48–53 in `solid-panes/dev/loader.ts`. You should see an event listener that is ready for a string. `renderPane('https://solidos.solidcommunity.net/Team/SolidOs%20team%20chat/index.ttl#this')` will be the default. Depending on the `pane.js` that you chose in the earlier import statements, the `renderPane` function determines the way you will see DOMContent inside of that particular pane. If you have created an `index.html` in your provider pod storage area, you could use `'https://yoursolidname.solidcommunity.net/profile/index.html'` inside of the `renderPane()` function parameters. You can edit the string manually in `solid-panes/dev/loader.ts`, or you can go to your developer console and type `renderPane('https://yoursolidname.solidcommunity.net/profile/index.html')` — just point to a part of your account that is congruent to the pane that you wish to import! :) 67 | 68 | ## Contributing panes 69 | When you created a pane, you can either add it as an npm dependency 70 | of this repo (for instance meeting-pane, issue-pane, chat-pane are all 71 | imported in src/registerPanes.js), or add it under the src/ tree of this repo. 72 | 73 | 74 | ## Eg. some RDF CLasses 75 | 76 | Here, just to show how it works, are how some RDF Classes map onto panes. Anything to do with 77 | contacts (A VCARD Address Book, Group, Individual, Organization) can be handled by the one contact 78 | pane. Any other pane which wants to deal with contacts can just use the pane within its own user interface. 79 | 80 |  81 | -------------------------------------------------------------------------------- /dev/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |22 | A handy tool for pane developers. Put your JS or TS file in dev/pane/. 23 | Run renderPane('https://solidos.solidcommunity.net/profile/card#me') from the console. 24 | Don't forget that the resource owner needs to add http://localhost:9000 as a trusted app. 25 |
26 |