Skip to content
GitLab
    • Explore Projects Groups Snippets
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • I iOS application
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 155
    • Issues 155
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Container Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • MemriMemri
  • iOS application
  • Merge requests
  • !14

Caching2

  • Review changes

  • Download
  • Email patches
  • Plain diff
Merged Ruben Daniels requested to merge caching2 into dev 5 years ago
  • Overview 0
  • Commits 36
  • Pipelines 0
  • Changes 35
Compare
  • version 4
    7bd9acc2
    5 years ago

  • version 3
    aae4b72f
    5 years ago

  • version 2
    a818e971
    5 years ago

  • version 1
    a818e971
    5 years ago

  • dev (base)

and
  • latest version
    7d37a825
    36 commits, 5 years ago

  • version 4
    7bd9acc2
    35 commits, 5 years ago

  • version 3
    aae4b72f
    34 commits, 5 years ago

  • version 2
    a818e971
    33 commits, 5 years ago

  • version 1
    a818e971
    40 commits, 5 years ago

35 files
+ 1707
- 440

    Preferences

    File browser
    Compare changes
me‎mri‎
a‎pi‎
api.‎swift‎ +174 -38
con‎trol‎
rend‎erer‎
ListRende‎rer.swift‎ +12 -13
RichTextEd‎itor.swift‎ +2 -2
TextRende‎rer.swift‎ +4 -3
ThumbnailRe‎nderer.swift‎ +7 -6
Applicat‎ion.swift‎ +32 -3
Browse‎r.swift‎ +11 -14
ContextP‎ane.swift‎ +9 -4
Search‎.swift‎ +7 -6
TopNaviga‎tion.swift‎ +21 -19
util.‎swift‎ +69 -1
mo‎del‎
cache‎.swift‎ +491 -0
model‎.swift‎ +214 -79
vi‎ew‎
Sessio‎n.swift‎ +58 -157
SessionV‎iew.swift‎ +53 -48
Main.‎swift‎ +280 -0
SceneDele‎gate.swift‎ +12 -4
memri.x‎codeproj‎
project.xcwork‎space/…/swiftpm‎
Package.‎resolved‎ +25 -0
project‎.pbxproj‎ +54 -4
memri‎Tests‎
a‎pi‎
PodAPITe‎st.swift‎ +2 -2
da‎ta‎
0x01‎.json‎ +8 -0
0x02‎.json‎ +8 -0
0x03‎.json‎ +8 -0
0x04‎.json‎ +8 -0
0x05‎.json‎ +8 -0
default_se‎ssions.json‎ +54 -0
empty_ses‎sion.json‎ +1 -1
empty_ses‎sions.json‎ +11 -14
notes_from_‎server.json‎ +42 -0
sessions_manua‎lly_single.json‎ +1 -1
mo‎del‎
ModelTe‎st.swift‎ +10 -10
vi‎ew‎
SessionT‎est.swift‎ +6 -6
SessionsVie‎wTest.swift‎ +4 -4
playground/memriPl‎ayground.playground‎
Reso‎urces‎
test_ses‎sion.json‎ +1 -1
Sou‎rces‎
API_exampl‎e.notswift‎ +0 -0
memri/api/api.swift
+ 174
- 38
  • View file @ 7d37a825

  • Edit in single-file editor

  • Open in Web IDE


import Foundation
import UIKit
import Combine
public struct QueryOptions {
public struct QueryOptions: Codable {
/**
* Name of the property to sort on
* Retrieves the query which is used to load data from the pod
*/
public var sortProperty: String
var query: String = ""
/**
* Name of the property to sort on
* Retrieves the property that is used to sort on
*/
public var sortAscending: Bool
public var sortProperty: String? = ""
/**
* Retrieves whether the sort direction
* -1 no sorting is applied
* 0 sort descending
* 1 sort ascending
*/
public var sortAscending: Int = 0
/**
* Retrieves the number of items per page
*/
public var pageCount: Int = 0
/**
*
*/
public var pageIndex: Int = 0
init(query:String) {
self.query = query
}
public init(from decoder: Decoder) throws {
jsonErrorHandling(decoder) {
query = try decoder.decodeIfPresent("query") ?? query
sortProperty = try decoder.decodeIfPresent("sortProperty") ?? sortProperty
sortAscending = try decoder.decodeIfPresent("sortAscending") ?? sortAscending
pageCount = try decoder.decodeIfPresent("pageCount") ?? pageCount
}
}
}
public class SettingsData {
/**
* Possible values: "default", "device", "group", "user"
*/
public var type: String
/**
* Used by device and group (and perhaps user)
*/
public var name: String
private var data:[String:AnyObject] = [:]
public init(_ type:String, _ name:String) {
self.type = type
self.name = name
}
public var pageNr:Int
/**
*
*/
public func get(_ path:String) -> AnyObject? {
return data[path] ?? nil
}
public var pageSize:Int
/**
* Also responsible for saving the setting to the permanent storage
*/
public func set(_ path:String, _ value:AnyObject) -> Void {
data[path] = value
}
}
/*
* Retrieves data from the pod, or executes actions on the pod.
*/
public class PodAPI {
var key: String
@@ -24,45 +86,119 @@ public class PodAPI {
self.key = podkey
}
func remove(uid: String) -> Void {
print("removed \(uid)")
/**
* Sets the .id property on DataItem
*/
public func create(_ item:DataItem, _ callback: (_ error:Error?, _ id:String) -> Void) -> Void {
print("created \(item)")
callback(nil, "0x00");
}
func get(uid: String) -> DataItem {
return DataItem.fromUid(uid: uid)
/**
*
*/
public func get(_ id:String, _ callback: (_ error:Error?, _ item:DataItem) -> Void) -> Void {
if id == "sessions" {
let jsonString = try! stringFromFile("default_sessions", "json")
callback(nil, DataItem(id: "sessions", type: "sessions", properties: ["json": AnyCodable(jsonString)]))
return
}
callback(nil, DataItem(id: id, type: "note"))
}
func update(uid: String, dataItem: DataItem) -> Void {
print("updated \(uid)")
/**
*
*/
public func update(_ item:DataItem, _ callback: (_ error:Error?, _ success:Bool) -> Void) -> Void {
print("updated \(item.id)")
callback(nil, true);
}
func create(dataItem: DataItem) -> Void {
print("created \(dataItem)")
/**
*
*/
public func remove(_ id:String, _ callback: (_ error:Error?, _ success:Bool) -> Void) -> Void {
print("removed \(id)")
callback(nil, true);
}
func link(uid1: String, uid2: String, predicate: String) -> Void {
// TODO: arguments can either be uids or DataItems
print("linked \(uid1) - \(predicate) > \(uid2)")
/**
*
*/
public func link(_ subjectId:String, _ entityId:String, _ predicate:String, _ callback: (_ error:Error?, _ created:Bool) -> Void) -> Void {
print("linked \(subjectId) - \(predicate) > \(entityId)")
callback(nil, true);
}
func unlink(uid1: String, uid2: String, predicate: String) -> Void {
// TODO: arguments can either be uids or DataItems
print("unlinked \(uid1) - \(predicate) > \(uid2)")
public func link(_ item:DataItem, _ item2:DataItem, _ predicate:String, _ callback: (_ error:Error?, _ created:Bool) -> Void) -> Void {}
/**
*
*/
public func unlink(_ subjectId:String, _ entityId:String, _ predicate:String, _ callback: (_ error:Error?, _ success:Bool) -> Void) -> Void {
print("unlinked \(subjectId) - \(predicate) > \(entityId)")
callback(nil, true);
}
public func unlink(_ fromItem:DataItem, _ toItem:DataItem, _ predicate:String, _ callback: (_ error:Error?, _ success:Bool) -> Void) -> Void {}
public func query(_ query: String) -> SearchResult {
var searchResult = SearchResult()
/**
*
*/
public func query(_ query:QueryOptions, _ callback: (_ error:Error?, _ result:[DataItem]) -> Void) -> Void {
// // this simulates async call
// DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// // get result
// // parse json
// searchResult.data = [DataItem("0x0"), DataItem("0x1")]
// searchResult.fire(event: "onload")
// }
searchResult.data = try! DataItem.from_json(file: "test_dataItems")
// // this simulates async call
// DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// // get result
// // parse json
// searchResult.data = [DataItem("0x0"), DataItem("0x1")]
// searchResult.fire(event: "onload")
// }
return searchResult
if query.query.starts(with: "0x") {
callback(nil, try! DataItem.fromJSONFile(query.query))
return
}
if query.query == "notes" {
callback(nil, try! DataItem.fromJSONFile("notes_from_server"))
return
}
let items:[DataItem] = try! DataItem.fromJSONFile("test_dataItems")
callback(nil, items);
}
/**
*
*/
public func queryNLP(_ query:QueryOptions, _ callback: (_ error:Error?, _ result:[DataItem]) -> Void) -> Void {}
/**
*
*/
public func queryDSL(_ query:QueryOptions, _ callback: (_ error:Error?, _ result:[DataItem]) -> Void) -> Void {}
/**
*
*/
public func queryRAW(_ query:QueryOptions, _ callback: (_ error:Error?, _ result:[DataItem]) -> Void) -> Void {}
/**
* Returns a read-only SettingsData object.
*/
public func getDefaultSettings(_ callback: (_ error:Error?, _ result:[DataItem]) -> Void) -> Void {}
/**
* Returns a read-write SettingsData object.
*/
public func getDeviceSettings(_ callback: (_ error:Error?, _ result:[DataItem]) -> Void) -> Void {}
/**
* Returns a read-write SettingsData object when admin, otherwise read-only.
*/
public func getGroupSettings(_ groupId:String, _ callback: (_ error:Error?, _ result:[DataItem]) -> Void) -> Void {}
/**
* Returns a read-write SettingsData object.
*/
public func getUserSettings(_ callback: (_ error:Error?, _ result:[DataItem]) -> Void) -> Void {}
// public func import() -> Void {}
// public func export() -> Void {}
// public func sync() -> Void {}
// public func index() -> Void {}
// public func convert() -> Void {}
// public func augment() -> Void {}
// public func automate() -> Void {}
//
// public func streamResource(_ URI:String, _ options:StreamOptions, _ callback: (_ error:Error?, _ stream:Stream) -> Void) -> Void {}
}
memri/control/renderer/ListRenderer.swift
+ 12
- 13
  • View file @ 7d37a825

  • Edit in single-file editor

  • Open in Web IDE


@@ -47,6 +47,8 @@ class ListConfig: RenderConfig {
}
struct ListRenderer: Renderer {
@EnvironmentObject var main: Main
var name: String="list"
var icon: String=""
var category: String=""
@@ -58,33 +60,31 @@ struct ListRenderer: Renderer {
@State var abc: Bool=false
// var renderConfig: RenderConfig = RenderConfig()
var renderConfig: RenderConfig = ListConfig(press: ActionDescription(icon: nil, title: nil, actionName: "openView", actionArgs: [])
)
var renderConfig: RenderConfig = ListConfig(press:
ActionDescription(icon: nil, title: nil, actionName: "openView", actionArgs: []))
func setState(_ state:RenderState) -> Bool {return false}
func setState(_ state:RenderState) -> Bool { return false }
func getState() -> RenderState {RenderState()}
func getState() -> RenderState { RenderState() }
func setCurrentView(_ session:Session, _ callback:(_ error:Error, _ success:Bool) -> Void) {}
@EnvironmentObject var sessions: Sessions
var body: some View {
return VStack {
NavigationView {
List{
ForEach(self.sessions.currentSession.currentSessionView.searchResult.data) { dataItem in
ForEach(main.currentView.searchResult.data) { dataItem in
VStack{
Text(dataItem.properties["title"] ?? "")
Text(dataItem.properties["title"]!.value as! String)
.bold()
.frame(maxWidth: .infinity, alignment: .leading)
Text(dataItem.properties["content"] ?? "")
Text(dataItem.properties["content"]!.value as! String)
.frame(maxWidth: .infinity, alignment: .leading)
}.onTapGesture {
self.onTap(actionDescription: (self.renderConfig as! ListConfig).press!, dataItem: dataItem)
}
// .padding(.horizontal, 10)
// .padding(.vertical, 7)
}.onDelete{ indexSet in self.sessions.currentSession.currentSessionView.searchResult.data.remove(atOffsets: indexSet)
}.onDelete{ indexSet in self.main.currentView.searchResult.data.remove(atOffsets: indexSet)
}
}
.environment(\.editMode, $isEditMode)
@@ -96,13 +96,12 @@ struct ListRenderer: Renderer {
}
func onTap(actionDescription: ActionDescription, dataItem: DataItem){
self.sessions.currentSession.executeAction(action: actionDescription, dataItem: dataItem)
main.executeAction(actionDescription, dataItem)
}
}
struct ListRenderer_Previews: PreviewProvider {
static var previews: some View {
ListRenderer(isEditMode: .constant(.inactive)).environmentObject(try! Sessions.from_json("empty_sessions"))
ListRenderer(isEditMode: .constant(.inactive)).environmentObject(Main(name: "", key: "").mockBoot())
}
}
memri/control/renderer/RichTextEditor.swift
+ 2
- 2
  • View file @ 7d37a825

  • Edit in single-file editor

  • Open in Web IDE


@@ -19,7 +19,7 @@ struct RichTextEditor: UIViewRepresentable {
self.control = control
}
func textViewDidChange(_ textView: UITextView) {
control.dataItem.properties["content"] = textView.text
control.dataItem.properties["content"] = AnyCodable(textView.text)
}
}
@@ -30,7 +30,7 @@ struct RichTextEditor: UIViewRepresentable {
view.isUserInteractionEnabled = true
view.contentInset = UIEdgeInsets(top: 5,left: 10, bottom: 5, right: 5)
view.delegate = context.coordinator
view.text = self.dataItem.properties["content"]
view.text = ((self.dataItem.properties["content"]?.value ?? "") as! String)
return view
}
memri/control/renderer/TextRenderer.swift
+ 4
- 3
  • View file @ 7d37a825

  • Edit in single-file editor

  • Open in Web IDE


@@ -24,17 +24,18 @@ struct RichTextRenderer: Renderer {
func setState(_ state:RenderState) -> Bool {return false}
func getState() -> RenderState {RenderState()}
func setCurrentView(_ session:Session, _ callback:(_ error:Error, _ success:Bool) -> Void) {}
@EnvironmentObject var sessions: Sessions
@EnvironmentObject var main: Main
var body: some View {
return VStack{
RichTextEditor(dataItem: self.sessions.currentSession.currentSessionView.searchResult.data[0])
RichTextEditor(dataItem: main.currentView.searchResult.data[0])
}
}
}
struct RichTextRenderer_Previews: PreviewProvider {
static var previews: some View {
RichTextRenderer().environmentObject(try! Sessions.from_json("empty_sessions"))
RichTextRenderer().environmentObject(Main(name: "", key: "").mockBoot())
}
}
memri/control/renderer/ThumbnailRenderer.swift
+ 7
- 6
  • View file @ 7d37a825

  • Edit in single-file editor

  • Open in Web IDE


@@ -36,11 +36,12 @@ struct ThumbnailRenderer: View {
func getState() -> RenderState {RenderState()}
func setCurrentView(_ session:Session, _ callback:(_ error:Error, _ success:Bool) -> Void) {}
@EnvironmentObject var sessions: Sessions
@EnvironmentObject var main: Main
var body: some View {
QGrid(self.sessions.currentSession.currentSessionView.searchResult.data, columns: 3) { dataItem in
Text(dataItem.properties["title"] ?? "default title").asThumbnail()
QGrid(main.currentView.searchResult.data, columns: 3) { dataItem in
Text((dataItem.properties["title"]?.value as! String)).asThumbnail()
.onTapGesture {
self.onTap(actionDescription: (self.renderConfig as! ListConfig).press!, dataItem: dataItem)
@@ -49,10 +50,10 @@ struct ThumbnailRenderer: View {
}
func onTap(actionDescription: ActionDescription, dataItem: DataItem){
self.sessions.currentSession.executeAction(action: actionDescription, dataItem: dataItem)
main.executeAction(actionDescription, dataItem)
// func onTap(dataItem: DataItem){
// self.sessions.currentSession.openView(SessionView.fromSearchResult(searchResult: SearchResult.fromDataItems([dataItem]),
// main.openView(SessionView.fromSearchResult(searchResult: SearchResult.fromDataItems([dataItem]),
// rendererName: "richTextEditor"))
// }
}
@@ -60,6 +61,6 @@ struct ThumbnailRenderer: View {
struct ThumbnailRenderer_Previews: PreviewProvider {
static var previews: some View {
ThumbnailRenderer().environmentObject(try! Sessions.from_json("empty_sessions"))
ThumbnailRenderer().environmentObject(Main(name: "", key: "").mockBoot())
}
}
0 Assignees
None
Assign to
0 Reviewers
None
Request review from
Labels
0
None
0
None
    Assign labels
  • Manage project labels

Milestone
No milestone
None
None
Time tracking
No estimate or time spent
Lock merge request
Unlocked
2
2 participants
Ruben Daniels
Koen van der Veen
Reference: memri/ios-application-fixed-schema!14
Source branch: caching2

Menu

Explore Projects Groups Snippets